问题
This is slightly modified code from 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))
}
It says that contents of a slice argument can be modified by a function, but its header cannot. How can I print header of newSlice2 on my screen?
回答1:
The slice header is represented by the reflect.SliceHeader type:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
You may use package unsafe to convert a slice pointer to *reflect.SliceHeader
like this:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
And then you may print it like any other structs:
fmt.Printf("%+v", sh)
Output will be (try it on the Go Playground):
&{Data:1792106 Len:8 Cap:246}
See related questions:
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
来源:https://stackoverflow.com/questions/54195834/how-to-inspect-slice-header