想了想,介绍go的类型似乎写不出什么花样来,还是试着从赋值来切入介绍一下go的类型。
go有很多C的影子,我们知道C是没有引用的(引用是C++才具备的,引用的底层实现也是指针),不管是赋值还是在调用函数参数传递的时候都是传值的
go也是传值。
所以像下面的代码
package main import( "fmt" ) func main(){ var arr1=[4]int{1,2,3,4} var arr2=arr1 arr2[3]=6 fmt.Println(arr1) }
在上面的代码中,如果想让输出变成1,2,3,4的话,只需要将赋值语句改成 var arr2=&arr1 即可
不过在下面两个复合类型中,有些意外,分别是:
数组切片
字典(map)
他们虽然也传的是值,不过传递的值是地址。
分别介绍一下。
数组切片:
原生的数组大小是固定的,数组切片支持动态扩展,使用上比较像C++的vector,它其实可以抽象为由如下两个变量构成的一个结构体:
1 一个指向go的原生数组的指针
2 元素个数
所以,其实这也并不是什么意外,只是在传值的时候由于传递的是指针而已。
map:
使用上和STL的map差不多啦,STL的map底层实现是红黑树,不清楚go的map类型底层实现是啥。不过可以确定的是在数据的存储上也使用了指针,因此在传值的过程中因为传递的地址,看上去有点像传引用,还是贴一份代码吧
package main import( "fmt" ) func main(){ mp1:=make(map[string]string) mp1["123"]="456" mp2:=mp1 mp2["123"]="789" fmt.Println(mp1) }
输出的值是:
map[123:789]
可以看到mp1的值也被改变了。
接下来就是重头戏了,go的接口赋值。下篇谈一谈go的接口的底层实现,再说一说go的接口赋值。
有疑问加站长微信联系(非本文作者)