gpt4 book ai didi

go - 为什么当你删除前 n 项而不是最后 n 项时, slice 的容量会改变?

转载 作者:IT王子 更新时间:2023-10-29 01:25:41 26 4
gpt4 key购买 nike

我正在浏览 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)
}

结果:

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 项时 slice 的容量保持不变,但当您删除前 2 项时 slice 的容量会发生变化?

https://play.golang.org/p/ZNKwOYKDqOi

最佳答案

Go slice 被实现为一个结构:

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)
}

Playground :https://play.golang.org/p/pk3cpE_LsUV

输出:

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]

查看 slice 操作如何调整指针、长度和容量。 slice 只是底层数组的 View 或窗口。


引用资料:

The Go Blog: Go Slices: usage and internals

The Go Programming Language Specification:

关于go - 为什么当你删除前 n 项而不是最后 n 项时, slice 的容量会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com