123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
package mainimport ("fmt""reflect""unsafe")func printInt(i int) {fmt.Printf("int i: %p\n", &i)}func printInt2(i *int) {fmt.Printf("int i: %p\n", i)}func printStr(s string) {fmt.Printf("string s: %p\n", &s)hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))data := hdr.Datafmt.Printf("string s data: 0x%x\n", data)}func printStr2(s *string) {fmt.Printf("string s: %p\n", s)hdr := (*reflect.StringHeader)(unsafe.Pointer(s))data := hdr.Datafmt.Printf("string s data: 0x%x\n", data)}func printSlice(s []int) {fmt.Printf("slice s: %p\n", &s)hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))data := hdr.Datafmt.Printf("slice s data: 0x%x\n", data)}func printSlice2(s *[]int) {fmt.Printf("slice s: %p\n", s)hdr := (*reflect.SliceHeader)(unsafe.Pointer(s))data := hdr.Datafmt.Printf("slice s data: 0x%x\n", data)}type S struct {I int}func printStruct(s S) {fmt.Printf("struct s: %p, I: %p\n", &s, &(s.I))}func printStruct2(s *S) {fmt.Printf("struct s: %p, I: %p\n", &s, &(s.I))}func printInterface(i interface{}) {fmt.Printf("int i: %p\n", &i)}func printInterface2(i interface{}) {s := i.(S)fmt.Printf("struct s: %p, I: %p\n", &s, &(s.I))}func printInterface3(i interface{}) {s := i.(*S)fmt.Printf("struct s: %p, I: %p\n", s, &(s.I))}func main() {//test inti := 10fmt.Printf("int i: %p\n", &i)printInt(i)printInt2(&i)//test strings := "hello, world"fmt.Printf("\n\nstring s: %p\n", &s)hdr := (*reflect.StringHeader)(unsafe.Pointer(&s))data := hdr.Datafmt.Printf("string s data: 0x%x\n", data)printStr(s)printStr2(&s)//slice and mapsl := []int{1, 2, 3, 4, 5}fmt.Printf("\n\nslice s: %p\n", &sl)hdr2 := (*reflect.SliceHeader)(unsafe.Pointer(&sl))data = hdr2.Datafmt.Printf("slice s data: 0x%x\n", data)printSlice(sl)printSlice2(&sl)//structss := S{I: 10}ssp := &ssfmt.Printf("\n\nstruct s: %p, I: %p\n", ssp, &(ss.I))printStruct(ss)printStruct2(ssp)//interface to intfmt.Printf("\n\nint i: %p\n", &i)printInterface(i)//interface to structfmt.Printf("\n\nstruct s: %p, I: %p\n", ssp, &(ss.I))printInterface2(ss)printInterface3(ssp)} |