github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch6/41_unsafe_test.go (about) 1 package unsafe_test 2 3 import ( 4 "fmt" 5 "sync" 6 "sync/atomic" 7 "testing" 8 "time" 9 "unsafe" 10 ) 11 12 func TestUnsafe(t *testing.T) { 13 i := 10 14 f := *(*float64)(unsafe.Pointer(&i)) 15 t.Log(unsafe.Pointer(&i)) 16 t.Log(f) 17 } 18 19 // The cases is suitable for unsafe 20 type MyInt int 21 22 //合理的类型转换 23 func TestConvert(t *testing.T) { 24 a := []int{1, 2, 3, 4} 25 b := *(*[]MyInt)(unsafe.Pointer(&a)) 26 t.Log(b) 27 } 28 29 //原子类型操作 30 func TestAtomic(t *testing.T) { 31 var shareBufPtr unsafe.Pointer 32 writeDataFn := func() { 33 data := []int{} 34 for i := 0; i < 100; i++ { 35 data = append(data, i) 36 } 37 atomic.StorePointer(&shareBufPtr, unsafe.Pointer(&data)) 38 } 39 readDataFn := func() { 40 data := atomic.LoadPointer(&shareBufPtr) 41 fmt.Println(data, *(*[]int)(data)) 42 } 43 var wg sync.WaitGroup 44 writeDataFn() 45 for i := 0; i < 10; i++ { 46 wg.Add(1) 47 go func() { 48 for i := 0; i < 10; i++ { 49 writeDataFn() 50 time.Sleep(time.Microsecond * 100) 51 } 52 wg.Done() 53 }() 54 wg.Add(1) 55 go func() { 56 for i := 0; i < 10; i++ { 57 readDataFn() 58 time.Sleep(time.Microsecond * 100) 59 } 60 wg.Done() 61 }() 62 } 63 wg.Wait() 64 }