详解go中的引用类型

作者:Jokcy · 时间:2023-08-28 06:02:31 

值类型和引用类型

值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。  值拷贝

引用类型:特指slice、map、channel这三种预定义类型。引用类型拥有更复杂的存储结构:(1)分配内存 (2)初始化一系列属性等一个引用类型的变量r1存储的是r1的值所在的内存地址(数字),或内存地址中第一个字所在的位置,这个内存地址被称之为指针,这个指针实际上也被存在另外的某一个字中。 

两者的主要区别:拷贝操作和函数传参。

正文开始重点给大家介绍go中的引用类型。

首先,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也是如此,就不多讲来。

来源:https://studygolang.com/articles/27217

标签:go,引用类型
0
投稿

猜你喜欢

  • vue-cli3项目配置eslint代码规范的完整步骤

    2024-05-29 22:23:12
  • Python3列表删除的三种方式实现

    2021-03-26 17:55:55
  • Keras使用tensorboard显示训练过程的实例

    2023-07-15 18:57:35
  • 13个你可能未使用过的Python特性分享

    2021-03-07 19:14:37
  • Python爬虫采集Tripadvisor数据案例实现

    2022-01-28 14:54:28
  • 关于python中remove的一些坑小结

    2022-09-22 02:14:31
  • Python字典生成式、集合生成式、生成器用法实例分析

    2021-04-06 08:06:31
  • MySQL5.6.40在CentOS7 64下安装过程详解

    2024-01-12 21:56:01
  • 分别使用vue和Android实现长按券码复制功能

    2023-10-29 23:20:11
  • python中pandas对多列进行分组统计的实现

    2022-06-25 03:50:03
  • 用Python可视化新冠疫情数据

    2021-10-14 06:06:39
  • 删除多余的属性 xmlns=""

    2010-08-24 18:41:00
  • GoLang unsafe包详细讲解

    2024-02-02 05:09:46
  • Python异常对代码运行性能的影响实例解析

    2023-10-18 23:35:39
  • CSS+asp仿迅雷人气指数

    2009-08-03 14:11:00
  • js获取IP地址的方法小结

    2024-04-18 09:50:02
  • vue中的插槽详解

    2024-05-03 15:08:50
  • django rest framework vue 实现用户登录详解

    2022-04-15 00:53:52
  • PHP程序员最常犯的11个MySQL错误

    2012-01-05 19:13:02
  • Python 京东云无线宝消息推送功能

    2021-08-19 09:45:57
  • asp之家 网络编程 m.aspxhome.com