Slice Internals

Fill in the blank in line A, to assure that printOriginalSlice will print the original slice of a subslice

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. "unsafe"
  6. )
  7. const M = 10
  8. const N = 5
  9. func printOriginalSlice(subslice *[]int) {
  10. data := __ //A
  11. fmt.Printf("original\t%p:%+v\n", data, *data)
  12. }
  13. func main() {
  14. slice := make([]int, M)
  15. for i, _ := range slice {
  16. slice[i] = i
  17. }
  18. subslice := slice[0:N]
  19. fmt.Printf("slice\t%p:%+v\n", &slice, slice)
  20. fmt.Printf("subslice\t%p:%+v\n", &subslice, subslice)
  21. printOriginalSlice(&subslice)
  22. }

Answer

  1. package main
  2. import (
  3. "fmt"
  4. "reflect"
  5. "unsafe"
  6. )
  7. const M = 10
  8. const N = 5
  9. func printOriginalSlice(subslice *[]int) {
  10. data := (*[M]int)(unsafe.Pointer(((*reflect.SliceHeader)(unsafe.Pointer(subslice))).Data))
  11. fmt.Printf("original\t%p:%+v\n", data, *data)
  12. }
  13. func main() {
  14. slice := make([]int, M)
  15. for i, _ := range slice {
  16. slice[i] = i
  17. }
  18. subslice := slice[0:N]
  19. fmt.Printf("slice\t%p:%+v\n", &slice, slice)
  20. fmt.Printf("subslice\t%p:%+v\n", &subslice, subslice)
  21. printOriginalSlice(&subslice)
  22. }