Slice Internals
Fill in the blank in line A, to assure that printOriginalSlice will print the original slice of a subslice
package main
import (
"fmt"
"reflect"
"unsafe"
)
const M = 10
const N = 5
func printOriginalSlice(subslice *[]int) {
data := __ //A
fmt.Printf("original\t%p:%+v\n", data, *data)
}
func main() {
slice := make([]int, M)
for i, _ := range slice {
slice[i] = i
}
subslice := slice[0:N]
fmt.Printf("slice\t%p:%+v\n", &slice, slice)
fmt.Printf("subslice\t%p:%+v\n", &subslice, subslice)
printOriginalSlice(&subslice)
}
Answer
package main
import (
"fmt"
"reflect"
"unsafe"
)
const M = 10
const N = 5
func printOriginalSlice(subslice *[]int) {
data := (*[M]int)(unsafe.Pointer(((*reflect.SliceHeader)(unsafe.Pointer(subslice))).Data))
fmt.Printf("original\t%p:%+v\n", data, *data)
}
func main() {
slice := make([]int, M)
for i, _ := range slice {
slice[i] = i
}
subslice := slice[0:N]
fmt.Printf("slice\t%p:%+v\n", &slice, slice)
fmt.Printf("subslice\t%p:%+v\n", &subslice, subslice)
printOriginalSlice(&subslice)
}