KeKe-Li / For-learning-Go-Tutorial学习日记chapter03

78 阅读2分钟

数组和结构体都是固定内存大小的数据结构,slice和map则是动态的数据结构。 "=="可以比较两个数组的元素是否相同 slice的切片操作s[i:j]是对着切片的底层数组操作的。 slice创建方式主要有两种:

  1. 基于数组创建:对数组进行切片操作后获得切片。
  2. 直接创建:使用new(T) 返回 *T 指向一个零值 T,或者使用make(T) 返回初始化后的 T

注意: make仅适用于 map,slice 和 channel,并且返回的不是指针。应当用 new 获得特定的指针。

slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等元素。但是bytes.Equal函数可以用来判断两个字节型slice是否相等([]byte),但是对于其他类型的slice,我们必须自己展开每个元素进行比较。

slice唯一合法的"=="操作是和nil比较。

Slice的动态扩展是有代价的。

当slice的元素数超过cap时cap自动翻倍。

a[low : high : max]会构造与简单切片表达式a[low: high]相同类型、相同长度和元素的切片。另外,它会将得到的结果切片的容量设置为max-low。在完整切片表达式中只有第一个索引值(low)可以省略;它默认为0。

struct会继承匿名成员的方法和成员变量。

在Go语言中,所有的函数参数都是值拷贝传入的。

相等比较运算符==将比较两个结构体的每个成员。

困惑

(1) Go1.16 以前的 slice 的扩容条件是 len,在最新的代码中,已经改为了以 cap 属性作为基准。

  // src/runtime/slice.go
 if cap > doublecap {
  newcap = cap
 } else {
  // 这是以前的代码:if old.len < 1024 {
  // 下面是 Go1.16rc1 的代码
  if old.cap < 1024 {
   newcap = doublecap
  }

以官方的 test case 为例:

func main() {
 const N = 1024
 var a [N]int
 x := cap(append(a[:N-1:N], 9, 9))
 y := cap(append(a[:N:N], 9))
 println(cap(x), cap(y))
}

在 Go1.16 以前输出 2048, 1280。在 Go1.16 及以后输出 1280, 1280,保证了两种的一致。

关键词:

view 浅拷贝 浅相等