package unsafe_programing
import("fmt""sync""sync/atomic""testing""time""unsafe")//不安全 有一个叫unsafe的包//一般用在和外面C程序实现的高效的库 交互的时候需要//场景使用 比较特定化//Go中不支持强制类型转换 不安全指针可以转换为各种类型的指针type Customer struct{
Name string
Age int}funcTestUnsafe(t *testing.T){
i :=10
f :=*(*float64)(unsafe.Pointer(&i))
t.Log(f)//转换是非常危险的 会导致数据的变动}// The case is suitable for unsafetype MyInt int//合理的类型转化 别名转换//读写需要线程安全的特性funcTestConvert(t *testing.T){
a:=[]int{1,2,3,4}
b:=*(*[]MyInt)(unsafe.Pointer(&a))
t.Log(b)}//原子类型的操作funcTestAtomic(t *testing.T){var shareBufPtr unsafe.Pointer
writeDataFn :=func(){
data :=[]int{}for i :=0;i <100;i++{
data =append(data,i)}
atomic.StorePointer(&shareBufPtr,unsafe.Pointer(&data))}
readDataFn :=func(){
data := atomic.LoadPointer(&shareBufPtr)
fmt.Println(data,*(*[]int)(data))}var wg sync.WaitGroup
writeDataFn()for i:=0;i<10;i++{
wg.Add(1)gofunc(){for i:=0;i<10;i++{writeDataFn()
time.Sleep(time.Microsecond*100)}
wg.Done()}()
wg.Add(1)gofunc(){for i :=0;i<10;i++{readDataFn()}}()}}