go 内存二进制数据操作

go 内存二进制数据操作

go 内存二进制数据直接操作

以数字类型为例

int(linux/macos 为int32,windows 为int64). 如果不清楚可以使用unsafe.Sizeof函数来查看(函数出来的值*8就是int位数)

若不使用内存二进制数据操作,你需要在每次获取数字内容时调用binary.BigEndian/LittleEndian的方法来计算出数字大小。而具体是大端还是小端计算由系统决定.(win 小端,linux/macos 大端)

go 复制代码
import (
    "binary"
    "crypto/rand"
    "fmt"
)
func main(){
    var buff []byte=make([]byte,4)
    //创建一个随机数进
    _,err:=rand.Reader.Read(buff)
    if err!=nil{
        panic("random number failed "+err.Error())
    }
    //获取这个随机数的值
    fmt.Println(binary.BigEndian.Uint32(buff))
}

直接操纵内存获取

go 复制代码
import (
    "unsafe"
    "crypto/rand"
)
type Pointer[T any] struct{
    T *T
    buff []byte
}

func NewPointer[T any]()*Pointer[T]{
    var t T
    var ans = &Pointer[T]{buff:make([]byte,unsafe.Sizeof(t))}//获取类型占用内存字节数
    ans.T=(*T)(unsafe.Pointer(&ans.buff[0]))//将指针关联过去
    return ans
}
func (s *Pointer[T])Bytes()[]byte{
    return s.buff
}
func main(){
    ptr:=NewPointer[int]()
    _,err:=rand.Reader.Read(ptr.Bytes())
    if err!=nil{
        panic("random number failed "+err.Error())
    }
    fmt.Println(*ptr.T)//就像读取正常指针一样读取
}

多种类型复用同一块内存

go 复制代码
//以混合两种类型作为示范
type Union[T1 any,T2 any] struct{
    T1 *T1
    T2 *T2
    b []byte
}

func NewUnion[T1 any,T2 any]()*Union[T1,T2]{
    var (
        t1 T1
        t2 T2
    )
    maxsize:=unsafe.Sizeof(t1)
    t2size:=unsafe.Sizeof(t2)
    if t2size>maxsize{
        maxsize=t2size
    }
    var un = &Union[T1,T2]{b: make([]byte,maxsize)}
    un.T1=(*T1)(unsafe.Pointer(&un.b[0]))
    un.T2=(*T2)(unsafe.Pointer(&un.b[0]))
    return un
}
func (s *Union[T1,T2])Bytes()[]byte{
    return s.b
}
func main(){
    un:=NewUnion[int,float64]()
    *un.T1 = 23//存储23 int值
    *un.T2 = 178.5//需要作为float类型是设置为float类型
}
相关推荐
似水明俊德4 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
薛定谔的悦4 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士5 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
Thera7775 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
无限大65 小时前
职场逻辑03:3步搞定高效汇报,让领导看到你的价值
后端
炘爚6 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon6 小时前
C#常用类库-详解SerialPort
开发语言·c#
盐水冰6 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头6 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141596 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm