zoukankan      html  css  js  c++  java
  • 000、GO之深刻理解拷贝

    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

  • 相关阅读:
    OO第一单元总结
    [软件工程]提问回顾与个人总结
    结对项目-最长单词链总结
    [软件工程]第一次阅读作业
    [软件工程] 第0次作业
    提问回顾与个人总结
    结对作业博客
    软工第1次个人作业
    软工第0次个人作业
    OO第四次总结
  • 原文地址:https://www.cnblogs.com/geniushuangxiao/p/12819881.html
Copyright © 2011-2022 走看看