Go的赋值

u011408355 · · 2880 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

想了想,介绍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 而不是1,2,3,6

在上面的代码中,如果想让输出变成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的接口赋值。













有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:u011408355

查看原文:Go的赋值

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2880 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传