Go不安全编程

Go不安全编程

什么是不安全编程

package unsafe_programing

import (
	"fmt"
	"sync"
	"sync/atomic"
	"testing"
	"time"
	"unsafe"
)

//不安全 有一个叫unsafe的包
//一般用在和外面C程序实现的高效的库 交互的时候需要
//场景使用 比较特定化

//Go中不支持强制类型转换 不安全指针可以转换为各种类型的指针

type Customer struct {
	Name string
	Age int
}

func TestUnsafe(t *testing.T)  {
	i := 10
	f := *(*float64)(unsafe.Pointer(&i))
	t.Log(f)
	//转换是非常危险的 会导致数据的变动
}

// The case 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)
		}
		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)
		go func() {
			for i:=0;i<10;i++{
				writeDataFn()
				time.Sleep(time.Microsecond*100)
			}
			wg.Done()
		}()
		wg.Add(1)
		go func() {
			for i := 0;i<10;i++{
				readDataFn()
			}
		}()
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值