【Go】函数的使用

目录

函数返回多个值

init函数和import

init函数

main函数

函数的参数

值传递

引用传递(指针)


函数返回多个值

用法如下:

Go 复制代码
package main

import (
	"fmt"
	"strconv"
)

// 返回多个返回值,无参数名
func MultFunc1(a int, b int) (int, string) {
	a = a + 1
	b = b + 1
	//数字转字符串
	itoa := strconv.Itoa(b)
	return a, itoa

}

// 返回多个返回值,有参数名
func MultFunc2(a int, b int) (r1 int, r2 int) {
	//形参有默认值 是0
	fmt.Println("形参r1: ", r1, "r2: ", r2)
	r1 = a + 1
	r2 = b + 1
	return

}

func MultFunc3(a int, b int) (int, int) {
	a = a + 1
	b = b + 1
	return a, b

}

func main() {
	var a, b = MultFunc1(1, 2)
	fmt.Println("a=", a, "b=", b)
	var c, d = MultFunc2(3, 4)
	fmt.Println("c=", c, "d=", d)
	var e, f = MultFunc3(5, 6)
	fmt.Println("e=", e, "f=", f)
}

形参是有默认值的 0 ""(空串) false

init函数和import

init函数

init函数可以在package main 中,可在其他package中,可在同一个package中出现多次

main函数

main 函数只能在package main中。

执行顺序

golang中有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能用于package main)。这两个函数在定义的时候不能有任何的返回值和参数

虽然package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说都是不方便的,所以建议用户在一个package中每个文件只写一个init函数。

程序的初始化和执行都始于main包

如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。

当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。

等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:

测试例子

代码结构如下

Lib1.go

Go 复制代码
package lib1

import "fmt"

func init() {
	fmt.Print("我是lib1")
}

func Lib1Test() {
	fmt.Println("lib1Test")
}

Lib2.go

Go 复制代码
package lib2

import (
	"fmt"
)

func init() {
	fmt.Print("我是Lib2")
}
func Lib2Test() {
	fmt.Println("lib2Test")
}

main.go

注意:如果文中没有使用,就需要家一个_

Go 复制代码
package main

import (
	"fmt"
	"goProject/aaa/lib1"
	"goProject/aaa/lib2"
)

func init() {
	fmt.Print("我是Lib3.go")
}

func main() {
	lib1.Lib1Test()
	lib2.Lib2Test()

}

注意看打印的结果

输出的顺序与我们上面图给出的顺序是一致的

函数的参数

函数如果使用参数,该变量可称为函数的形参

形参就像是定义在函数体内的局部变量

调用函数,可以通过两种方式传递参数:

值传递

值传递是指在调用函数的时候将实际的参数复制一份传递到函数中,这样在函数中如果对参数进行修改,则不会影响到实际的参数。

默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。

下面使用一个经典的案例:两数交换

Go 复制代码
package main

import "fmt"

// 值传递
func Swap1(a int, b int) {
	var temp = a
	a = b
	b = temp

}

// 引用传递
func Swap2(a *int, b *int) {
	var temp = *a
	*a = *b
	*b = temp

}

func main() {
	a := 1
	b := 2
	Swap1(a, b)
	fmt.Println("值传递 a=", a, "b=", b)
	Swap2(&a, &b)
	fmt.Println("引用传递 a=", a, "b=", b)
}

执行结果如下:

第一种值传递的方式交换失败,是因为副本拷贝

第一种是引用传递,他是传递地址,那么引出了指针

引用传递(指针)

指针在C++中有用到。引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

详情,可以去看看C++,我也去看看!

相关推荐
奔跑吧邓邓子2 天前
【C++实战⑦】C++函数实战:从基础到项目应用
c++·实战·函数
花菜会噎住4 天前
MySQL 高级特性与性能优化:深入理解函数、视图、存储过程、触发器
android·mysql·函数·索引·视图
hsjkdhs7 天前
数据结构之链表(单向链表与双向链表)
数据结构·链表·指针
自信的小螺丝钉8 天前
Leetcode 876. 链表的中间结点 快慢指针
算法·leetcode·链表·指针
課代表10 天前
VBA 中的 Excel 工作表函数
excel·vba·函数·对象·属性·range·静态变量
长城202423 天前
从词源和输出生成等角度详细解析PHP中常用文件操作类函数
php·文件·函数·文件操作函数
Nuyoah11klay1 个月前
华清远见25072班C语言学习day11
c语言·指针·回调函数
的卢马飞快1 个月前
C语言指针(五):回调函数与 qsort 的深层关联
c语言·指针·qsort
HMBBLOVEPDX2 个月前
MySQL的单行函数:
数据库·mysql·函数
一川月白7092 个月前
C语言---万能指针(void *)、查找子串(strncmp函数的应用)多维数组(一维数组指针、二维数组指针)、返回指针值函数、关键字(const)
c语言·指针·const·万能指针·查找子串·多维数组指针