码迷,mamicode.com
首页 > 其他好文 > 详细

000、GO之深刻理解拷贝

时间:2020-05-02 22:37:07      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:原因   ack   int   div   range   import   case   for   main   

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的赋值

000、GO之深刻理解拷贝

标签:原因   ack   int   div   range   import   case   for   main   

原文地址:https://www.cnblogs.com/geniushuangxiao/p/12819881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!