内容简介:他们都是在内存中有独立空间的,也就是那么我们要让两个变量指向同一个内存怎么办呢,可以使用引用类型:这时候,y的类型是
首先,go中的赋值,都是值传递
a := 1 b := a x := Struct{} y := x 复制代码
他们都是在内存中有独立空间的,也就是 copy
的过程,所以这里对y的某个属性的改动,并不会影响x
那么我们要让两个变量指向同一个内存怎么办呢,可以使用引用类型:
y := &x 复制代码
这时候,y的类型是 *Struct
,这时候我们可以对y进行修改,修改完之后,x也会发现变化,因为y现在是一个引用类型,他指向的是x结构体所在的内存
我们可以通过:
y.variable = xxx 复制代码
来直接调用引用类型的结构体赋值,但是要注意的是,这是 go 的语法糖,他只是帮助我们简化了通过指针来获取实际内存的过程,完整的写法应该是这样的:
(*y).variable = xxx 复制代码
*y
是对指针的反引用,可以理解为 *y == x
。
为什么设计这个语法糖呢,是因为在go里面我们是无法直接操作指针,像c++中直接对内存地址进行计算进而得到其他内存地址的运算,在go里面是默认不支持的
print(y) // 得到类似0x8123这样的内存地址数据 // 理论上可以得到一个新的内存地址,但是在go里默认是不支持的 newAddr := y + 4 复制代码
因为无法直接操作地址,所以go就提供语法糖,让我们在使用引用类型进行操作的时候,默认就是对引用所指向的内存地址进行操作。
注意我们是可以对引用类型直接赋值的,但是赋值的类型也必须是引用类型
y = &Struct{} // 这样是可以的,但是不能是y = Struct{} a := 1 b := &a b = 2 // 这是不行的,因为b的类型是 *int 复制代码
特殊的引用类型
能够通过 make()
函数创建的都是引用类型,比如 slice
和 map
, slice
虽然看起来像数组,但是他其实是一个指向数组内存空间的一个指针类型
type Slice struct { point Point // 内存地址 len int cap int } 复制代码
所以我们在执行:
a := []int b = a 复制代码
会发现,好像b和a指向的是同一个数组,事实确实如此。 go中所有的赋值都是值传递,而slice的赋值,也是对slice对象的一次拷贝,也就是说a和b是不同的slice对象,但是他们指向同一个数组
同理map也是如此,就不多讲来。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- c# – 值类型是否包含引用类型?
- .NET 中的值类型与引用类型
- C#中的值类型和引用类型
- 智能合约基础语言(五):Solidity变量类型:引用类型
- 《JavaScript面向对象精要》之一:基本类型和引用类型
- golang的值类型,指针类型和引用类型&值传递&指针传递
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed Shaw / Example Product Manufacturer / 2011
This is a very beginner book for people who want to learn to code. If you can already code then the book will probably drive you insane. It's intended for people who have no coding chops to build up t......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!