000GO之深刻理解拷贝
Posted geniushuangxiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了000GO之深刻理解拷贝相关的知识,希望对你有一定的参考价值。
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的赋值
以上是关于000GO之深刻理解拷贝的主要内容,如果未能解决你的问题,请参考以下文章