Go的赋值
u011408355 · · 3472 次点击 · · 开始浏览想了想,介绍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的接口赋值。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
想了想,介绍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的接口赋值。