数组和结构体都是固定内存大小的数据结构,slice和map则是动态的数据结构。
"=="可以比较两个数组的元素是否相同
slice的切片操作s[i:j]是对着切片的底层数组操作的。
slice创建方式主要有两种:
- 基于数组创建:对数组进行切片操作后获得切片。
- 直接创建:使用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 浅拷贝 浅相等