这是来自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的标题?
答案 0 :(得分:9)
切片标头由reflect.SliceHeader
类型表示:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
您可以使用包unsafe
将切片指针转换为*reflect.SliceHeader
,如下所示:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
然后您可以像打印其他任何结构一样打印它:
fmt.Printf("%+v", sh)
输出将是(在Go Playground上尝试):
&{Data:1792106 Len:8 Cap:246}
查看相关问题:
How to create an array or a slice from an array unsafe.Pointer in golang?