Go 不安全编程
2022年1月18日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
package unsafe_test import ( "fmt" "sync" "sync/atomic" "testing" "unsafe" ) type Customer struct { Name string Age int } /** * 不安全得数值类型转换 */ func TestUnsafe(t *testing.T) { i := 10 f := *(*float64)(unsafe.Pointer(&i)) t.Log(unsafe.Pointer(&i)) t.Log(f) } // The cases is suitable for unsafe type MyInt int /** * 合理的类型转换 */ func TestConvert(t *testing.T) { a := []int{1, 2, 3, 4} b := *(*[]MyInt)(unsafe.Pointer(&a)) t.Log(b) } //原子类型操作 func TestAtomic(t *testing.T) { var shareBufPtr unsafe.Pointer /** * 写入数据的方法 */ writeDataFn := func() { data := []int{} for i := 0; i < 100; i++ { data = append(data, i) } //为了线程安全使用 tomic.StorePointer 将 unsafe.Pointer(&data)的地址放入shareBufPtr atomic.StorePointer(&shareBufPtr, unsafe.Pointer(&data)) } /** * 打印数据得方法 */ readDataFn := func() { data := atomic.LoadPointer(&shareBufPtr) fmt.Println(data, *(*[]int)(data)) } writeDataFn() //先创建一条数据 var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { for i := 0; i < 10; i++ { writeDataFn() } wg.Done() }() wg.Add(1) go func() { for i := 0; i < 10; i++ { readDataFn() } wg.Done() }() } wg.Wait() } |