gpt4 book ai didi

go - 如何检查 slice 头?

转载 作者:IT王子 更新时间:2023-10-29 01:18:11 28 4
gpt4 key购买 nike

这是来自 slices 的略微修改的代码

var buffer [256] byte

func SubtractOneFromLength(slice []byte) []byte {
slice = slice[0 : len(slice)-1]
return slice
}

func main() {
slice := buffer[10:20]
fmt.Println("Before: len(slice) =", len(slice))
newSlice := SubtractOneFromLength(slice)
fmt.Println("After: len(slice) =", len(slice))
fmt.Println("After: len(newSlice) =", len(newSlice))
newSlice2 := SubtractOneFromLength(newSlice)
fmt.Println("After: len(newSlice2) =", len(newSlice2))
}

它说 slice 参数的内容可以被函数修改,但它的头不能。如何在我的屏幕上打印 newSlice2 的标题?

最佳答案

slice 头由 reflect.SliceHeader 表示输入:

type SliceHeader struct {
Data uintptr
Len int
Cap int
}

您可以使用包 unsafe将 slice 指针转换为 *reflect.SliceHeader,如下所示:

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))

然后您可以像打印任何其他结构一样打印它:

fmt.Printf("%+v", sh)

输出将是(在 Go Playground 上尝试):

&{Data:1792106 Len:8 Cap:246}

另请注意,您可以在不使用包 unsafereflect 的情况下访问存储在 slice header 中的信息:

  • 要获取 Data 字段,您可以使用 &newSlice2[0]
  • 要获取 Len 字段,请使用 len(newSlice2)
  • 要获取 Cap 字段,请使用 cap(newSlice2)

查看修改后的 Go Playground显示这些值与 slice header 中的值相同的示例。

查看相关问题:

How to create an array or a slice from an array unsafe.Pointer in golang?

nil slices vs non-nil slices vs empty slices in Go language

关于go - 如何检查 slice 头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54195834/

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