这是从片中稍微修改的代码
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)) }
它说切片参数的内容可以由函数修改,但其标头不能。如何在屏幕上打印newSlice2的标题?
切片标头由以下reflect.SliceHeader类型表示:
reflect.SliceHeader
type SliceHeader struct { Data uintptr Len int Cap int }
您可以使用package unsafe将切片指针转换为*reflect.SliceHeader:
unsafe
*reflect.SliceHeader
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
然后,您可以像其他任何结构一样打印它:
fmt.Printf("%+v", sh)
输出将是(在Go Playground上尝试):
&{Data:1792106 Len:8 Cap:246}