slice.go 910 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. "unsafe"
  6. )
  7. type slice struct {
  8. arrayPtr uint
  9. len uint
  10. cap uint
  11. }
  12. func (s slice) Data() []byte {
  13. var p *byte
  14. var i uint
  15. res := make([]byte, s.len)
  16. for i = 0; i < s.len; i++ {
  17. p = (*byte)(unsafe.Pointer(uintptr(s.arrayPtr) + uintptr(i)))
  18. res[i] = *p
  19. }
  20. return res
  21. }
  22. func Dump(slicePtr *[]byte) {
  23. var n uintptr = uintptr(unsafe.Pointer(slicePtr))
  24. var s *slice = (*slice)(unsafe.Pointer(n))
  25. fmt.Println(*s)
  26. fmt.Printf("Len: %d, Cap: %d: Data:\n", s.len, s.cap)
  27. fmt.Printf("%#v\n", s.Data())
  28. }
  29. func main() {
  30. var max byte = 13
  31. a := make([]byte, max, 64)
  32. var i byte
  33. for i = 0; i < max; i++ {
  34. a[i] = '@' + i
  35. }
  36. fmt.Println(a, len(a), cap(a))
  37. Dump(&a)
  38. var z int
  39. fmt.Println(unsafe.Sizeof(z))
  40. r := strings.NewReader("ceci est une chaîne")
  41. var s []byte
  42. n, err := r.ReadAt(s, 4)
  43. fmt.Println("Read: %n (%v): %#v\n", n, err, s)
  44. }