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类型
}
相关推荐
BingoGo7 分钟前
PHP 集成 FFmpeg 处理音视频处理完整指南
后端·php
数字人直播14 分钟前
稳了!青否数字人分享3大精细化AI直播搭建方案!
前端·后端
听风的码19 分钟前
Vue2封装Axios
开发语言·前端·javascript·vue.js
掘金一周26 分钟前
被老板逼出来的“表格生成器”:一个前端的自救之路| 掘金一周 8.21
前端·人工智能·后端
SimonKing1 小时前
开源新锐:SQL玩转搜索引擎?Manticore颠覆你的认知
java·后端·程序员
素界UI设计1 小时前
建筑行业变革:用Three.js构建BIM数据可视化孪生平台
开发语言·javascript·信息可视化
MaxHua2 小时前
数据库入门指南与实战进阶-Mysql篇
后端
用户4099322502122 小时前
FastAPI的死信队列处理机制:为何你的消息系统需要它?
后端·ai编程·trae
王廷胡_白嫖帝2 小时前
Qt个人通讯录项目开发教程 - 从零开始构建联系人管理系统
开发语言·qt
用户4822137167752 小时前
C++——纯虚函数、抽象类
后端