函数

函数是 Go 里面的基本代码块。是go语言中的一等公民。

除了main函数和 init 函数外,其他的函数都是可以有返回值的,并且go中的函数支持多个返回值。

函数中的参数传递是值传递,而不是引用传递,函数中修改的值不会影响原始的值。(map 修改的时候会影响是因为对象的副本和原对象的引用是一个)

函数支持多个返回值,在声明函数的时候再函数的末尾声明返回值的类型和个数

示例:

1
func a(param int) int,string

函数也可以作为函数的参数和返回值

多个入参和出参的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func TestFunc1(t *testing.T) {
sum,multiply := calcFunc(10,10)
t.Logf("和为 %d 乘积为 %d",sum,multiply)
}

func calcFunc(a int, b int) (int, int) {

return a + b, a * b
}


//输出
//type_test.go:424: 和为 20 乘积为 100

当有返回值的时候,但是并不需要全部接收,那么可以使用 _ 作为一个空白的占位符不做任何处理

变长参数函数

在类型前加… 表示变长参数

1
2
3
4
5
6
7
8
9
10
11
12
13
func addAll(a ...int) int {
ret := 0
for _,d := range a{
ret = ret + d
}
return ret
}


func TestAddAll(t *testing.T) {
ret := addAll(1,2,3,4)
t.Log(ret)
}

参数和返回值传递函数

通过对函数进行传递可以做到在原有函数上拓展一些功能,返回一个增强的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//打印程序执行时间
func timeCost(inner func(op int) int) func(op int) int {
return func(o int) int {
start := time.Now()
ret := inner(o)
fmt.Printf("程序耗时: %f \n",time.Since(start).Seconds())
return ret
}
}

func runFunc(n int) int{
time.Sleep(time.Second * 2)
return n
}

//测试函数
func TestCost(t *testing.T) {
cost := timeCost(runFunc)
cost(1)
}

defer

关键字 defer 允许我们推迟到函数返回之前(或任意位置执行 return 语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为 return 语句同样可以包含一些操作,而不是单纯地返回某个值)。

defer 非常类似于java 中的finaly 块的代码.
不管函数执行过程中是否抛出异常,defer 修改的函数是一定会执行的,并且在返回之前执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

func TestDefer(t *testing.T) {
ret := deferTest()
fmt.Printf("获取到返回值 %d",ret)
}

var resouceOpen bool = false

func deferTest() int{
resouceOpen = true
fmt.Println("开启资源====>")
defer closeResource()
fmt.Println("执行逻辑")
return 1
}

func closeResource() {
fmt.Println("关闭资源====>")
resouceOpen = false
}

执行结果顺序

1
2
3
4
开启资源====>
执行逻辑
关闭资源====>
获取到返回值 1--- PASS: TestDefer (0.00s)

内置函数

Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len()、cap() 和 append()。

  • close() 管道通信
  • len()、cap() 获取长度和容量
  • new()、make() 都是用来分配内存,new一般用于值类型和用户自定义的类型,make用于内置类型
  • copy()、append() 用于复制和连接
  • panic()、recover() 用来错误处理机制
  • print()、println()用于打印
  • complex()、real ()、imag() 用于创建和操作复用