01、值类型和引用类型
GO只有slice、map、chan 3种引用类型,其它都是值类型
02、slice引用拷贝
1 package main 2 3 import ( 4 "fmt" 5 ) 6 7 func appendSlice(s []int) { 8 s[0] = 10//成功修改main中s[0]的值 9 s = append(s, 11)//因为引用拷贝的原因,main函数中的slice引用的数组并未追加 10 } 11 func main() { 12 s := make([]int, 1, 2) 13 appendSlice(s) 14 fmt.Println(s) 15 }
运行结果:[10]
03、匿名函数指针传递
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func main() { 9 s := []int {1,2,3} 10 for i,v := range s { 11 fmt.Println("v的地址为:", &v) 12 go func(i int) { 13 fmt.Println("序号:", i, ", 匿名函数中v的地址为:", &v, ",值为:", v) 14 }(i) 15 } 16 select {//3秒后退出 17 case <-time.After(3 * time.Second): 18 } 19 }
运行结果:
v的地址为: 0xc000126090
v的地址为: 0xc000126090
v的地址为: 0xc000126090
序号: 2 , 匿名函数中v的地址为: 0xc000126090 ,值为: 3
序号: 0 , 匿名函数中v的地址为: 0xc000126090 ,值为: 2
序号: 1 , 匿名函数中v的地址为: 0xc000126090 ,值为: 3
解释:因为传入匿名函数中的v和原来的v指针地址相同,所以是同一个值。匿名函数中打印的v的值,是看外面for循环给v的赋值
04、闭包
1 package main 2 3 import ( 4 "fmt" 5 ) 6 func add(plus bool) func(m,n int)(sum int) { 7 return func(m, n int) (sum int) {//传入的plus的地址和原来plus地址相同 8 sum = m + n 9 if !plus { 10 sum = -sum 11 } 12 plus = !plus 13 return 14 } 15 } 16 func main() { 17 a1 := add(true) 18 fmt.Println(a1(1,2)) 19 fmt.Println(a1(1,2)) 20 }
运行结果:
3
-3