我正在浏览 Go 并想了解以下内容:
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Drop its last two values
s = s[:len(s)-2]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
Result:
len=6 cap=6 [2 3 5 7 11 13]
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]
为什么当您删除最后 2 个项目时,切片的容量保持不变,但当您删除前 2 个项目时,切片的容量会发生变化?
https://play.golang.org/p/ZNKwOYKDqOi
Go 切片被实现为一个结构体:
src/runtime/slice.go
:
type slice struct {
array unsafe.Pointer
len int
cap int
}
修改你的printSlice
函数显示指向底层数组的指针:
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Drop its last two values
s = s[:len(s)-2]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
var ptr *int
if cap(s) >= 1 {
ptr = &s[:cap(s)][0]
}
fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}
操场:https://play.golang.org/p/pk3cpE_LsUV
Output:
ptr=0x450000 len=6 cap=6 [2 3 5 7 11 13]
ptr=0x450000 len=4 cap=6 [2 3 5 7]
ptr=0x450008 len=2 cap=4 [5 7]
查看切片操作如何调整指针、长度和容量。切片只是底层数组的视图或窗口。
参考:
Go 博客:Go Slices:用法和内部结构
Go 编程语言规范:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)