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
package lib1 import "fmt" func init() { fmt.Print("我是lib1") } func Lib1Test() { fmt.Println("lib1Test") }
Lib2.go
package lib2 import ( "fmt" ) func init() { fmt.Print("我是Lib2") } func Lib2Test() { fmt.Println("lib2Test") }
main.go
注意:如果文中没有使用,就需要家一个_
package main import ( "fmt" "goProject/aaa/lib1" "goProject/aaa/lib2" ) func init() { fmt.Print("我是Lib3.go") } func main() { lib1.Lib1Test() lib2.Lib2Test() }
注意看打印的结果
输出的顺序与我们上面图给出的顺序是一致的
函数的参数
函数如果使用参数,该变量可称为函数的形参
形参就像是定义在函数体内的局部变量
调用函数,可以通过两种方式传递参数:
值传递
值传递是指在调用函数的时候将实际的参数复制一份传递到函数中,这样在函数中如果对参数进行修改,则不会影响到实际的参数。
默认情况下,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++,我也去看看!
到此这篇关于Go函数的使用的文章就介绍到这了,更多相关Go函数使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!