go语言 数组和切片有何异同?

数组和切片有何异同?

Go 语言中的切片(slice)结构体的本质是对数组的封装,描述一个数组的片段。无论是数组还是切片,都可以通过下标来访问单个元素。

数组是定长的,长度定义好之后,不能修改。在Go 语言中,数组是不常见的,因为其长度是类型的一部分,限制了它的表达能力,比如[3]int 和 [4]int 就是不同的类型。而切片则是非常灵活的,它可以动态地扩容,而且切片的类型和长度无关。

看一个栗子:

func main() {
	arr1 := [1]int{1}
	arr2 := [2]int{1, 2}

	if arr1 == arr2 {
		fmt.Println("相同的类型")
	}
}

尝试运行,会报编译错误:
invalid operation: arr1 == arr2 (mismatched types [1]int and [2]int)
因为两个数组的长度不同,根本不是同一个类型,所以不能进行比较。
数组是一片连续的内存,切片实际上是一个结构体,包含三个字段: 长度,容量,底层数组。

// src/runtime/slice.go
type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

切片的数据结构如下图所示:
在这里插入图片描述
需要注意的是,底层数组可以被多个切片同时指向,因此对一个切片的元素进行操作时有可能会影响到其他切片。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值