本文共 842 字,大约阅读时间需要 2 分钟。
在本文中, 我们来简要说一下go的值类型和引用类型, 这很重要。
在go中,
值类型有: int float bool string array等
引用类型有: slice map channel等
来看个简单的程序:
package mainimport ( "fmt")func main() { a :=[6]int{1,2,3,4,5,6} b := a b[2]=7 fmt.Println(a, b)}
结果:[1 2 3 4 5 6] [1 2 7 4 5 6]
可以看到a和b不同, 这很好理解, 继续看程序:
package mainimport ( "fmt")func main() { a :=[]int{1,2,3,4,5,6} b := a b[2]=7 fmt.Println(a, b)}
结果是:[1 2 7 4 5 6] [1 2 7 4 5 6]
a和b居然相同, 仅仅由array变成slice, a和b居然就同时变化, 这是为毛毛?
要注意, 这里的a是slice, 是引用类型, b:=a时, 实际上是b对a的引用, 所以a和b可以理解为是同一个东东。 c/c++的学习这尤其需要注意这点。
再来看个程序:
package mainimport ( "fmt")func fun(m map[string]int){ m["good"] = 10000;}func main() { x := make(map[string]int) x["good"] = 10 fun(x) fmt.Println(x)}
熟悉c/c++的人肯定说, 结果是10, 然而,在go中, 是10000, 看看打印的结果:map[good:10000]
这是为毛毛呢? 因为在go中, map是引用类型, 所以结果如上, c/c++程序员们, 得注意啊。
转载地址:http://odzti.baihongyu.com/