package main

import (
	"fmt"
	"unsafe"
)

type Record struct {
	Flag  byte
	Count uint64
	Code  uint16
}

func main() {
	var r Record
	fmt.Printf("layout: size=%d align=%d offsets=%d,%d,%d\n",
		unsafe.Sizeof(r), unsafe.Alignof(r),
		unsafe.Offsetof(r.Flag), unsafe.Offsetof(r.Count), unsafe.Offsetof(r.Code))
	fmt.Println("descriptors:", unsafe.Sizeof("Go"), unsafe.Sizeof(make([]byte, 1000)))
	a := [3]uint32{10, 20, 30}
	p := (*uint32)(unsafe.Add(unsafe.Pointer(&a[0]), unsafe.Sizeof(a[0])))
	*p = 21
	view := unsafe.Slice(&a[0], len(a))
	view[2] = 31
	fmt.Println("shared:", a, view)
	b := []byte{'G', 'o'}
	s := unsafe.String(unsafe.SliceData(b), len(b))
	fmt.Println("string:", s)
	// After constructing s, do not modify b while s is in use.
}
