目录

Go中的引用变量

目录

Go语言的函数参数传递,只有值传递,没有引用传递。Slice、Map 只是胖指针,在传参时同样是值传递。

除了函数传参,range Slice、range Map 也是按值拷贝,并不能取得容器里内容的引用。

Go里面有没有引用的概念呢?我的答案是有,而且只有一种情况体现了引用的概念:闭包变量按引用捕获

分析下面代码:在线运行playground

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
	"fmt"
)

func gen() (func() int, func() int) {
	a := 0
	return func() int {
			a++
			return a
		},
		func() int {
			a++
			return a
		}
}

func main() {
	f1, f2 := gen()
	fmt.Println(f1()) // 1
	fmt.Println(f2()) // 2
}

闭包函数f1和f2都捕获了变量a,f1运行后影响了f2的结果,说明两个闭包函数都是捕获的a的引用。

实现上来讲,应该是函数值f1和f2都指向同一个闭包环境,因次f1对a的修改对f2也是可见的。

从结果上来看,两个闭包函数都有对同一个闭包环境里变量a的引用。