Go语言中的值类型和引用类型

一、值类型和引用类型

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

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

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

二、实例详解值类型和引用类型

数组array和切片slice的实例:

定义了一个数组a,它是值类型,复制给b是copy,当b发生变化后a并不会发生任何变化,程序的执行结果如下所示:

//由 main 函数作为程序入口点启动
func main() {
	a :=[5]int{1,2,3,4,5}
	b := a
	b[2] = 8
	fmt.Println(a, b)
}

切片则不然,如下代码所示:

//由 main 函数作为程序入口点启动
func main() {
	a :=[]int{1,2,3,4,5}
	b := a
	b[2] = 8
	fmt.Println(a, b)
}

程序输出结果:a和b本质上指向同一个底层数组。  切片的底层数据结构其实是一个指针、len、cap。


  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Go语言的 map 和 slice 都是非常常用的数据结构,它们的实现都是基于底层的数组实现的。 ### Map Go语言的 map 是一种无序的键对集合,可以通过 key 来快速查找对应的 value。map 的底层实现是一个哈希表,可以通过哈希函数将 key 映射到一个桶,每个桶存储一个链表,用于解决哈希冲突。 当我们向 map 添加一个元素时,会先根据 key 计算哈希,然后将元素插入到对应的桶。如果两个 key 的哈希相同,那么它们会被插入到同一个桶,采用链表方式解决冲突。 在对 map 进行遍历时,Go语言会按照 key 的哈希顺序遍历所有的桶,然后依次遍历每个桶的链表,因此 map 的遍历是无序的。 ### Slice Go语言的 slice 是一种动态数组,可以根据需要动态增加或删除元素。slice 的底层实现是一个数组指针、一个长度和一个容量。slice 本身不存储元素,而是引用底层数组的元素。 当我们向 slice 添加一个元素时,如果当前 slice 的长度已经达到了容量上限,Go语言会自动重新分配一个更大的底层数组,并将原有元素复制到新的数组。因此,slice 的容量也可以动态增加。 在对 slice 进行遍历时,可以使用 for range 循环,也可以使用下标方式访问 slice 的元素。 需要注意的是,map 和 slice 都是引用类型,因此在函数调用时,传递的是引用,而不是。如果修改了 map 或 slice 的元素,会影响到原始的 map 或 slice。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值