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

posted on 2020-05-02 22:01  TBBS  阅读(165)  评论(0编辑  收藏  举报