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之深刻理解拷贝的主要内容,如果未能解决你的问题,请参考以下文章

深刻理解 引用类型浅拷贝深拷贝

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)

深刻理解Python中的元类(metaclass)