这是来自切片的稍微修改过的代码
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的标题?
发布于 2019-01-15 09:29:01
片头由reflect.SliceHeader类型表示:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}您可以使用包unsafe将片指针转换为*reflect.SliceHeader,如下所示:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))然后你可以像其他任何结构一样打印它:
fmt.Printf("%+v", sh)输出将是(在围棋游乐场上尝试):
&{Data:1792106 Len:8 Cap:246}还要注意,您可以访问存储在片头中的信息,而无需使用包unsafe和reflect。
Data字段,可以使用&newSlice2[0]Len字段,请使用len(newSlice2)Cap字段,请使用cap(newSlice2)请参见修改后的围棋游乐场示例,该示例显示这些值与片头中的值相同。
见有关问题:
https://stackoverflow.com/questions/54195834
复制相似问题