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类型
}
相关推荐
h***06656 分钟前
Spring Boot 集成 Kettle
java·spring boot·后端
爱写代码的小朋友15 分钟前
21天学通Python全栈开发实战指南
开发语言·python
苦荞米16 分钟前
异步方法-C#中坑最大最深的功能
开发语言·c#
n***840718 分钟前
Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
android·前端·后端
软件测试曦曦19 分钟前
使用Python接口自动化测试post请求和get请求,获取请求返回值
开发语言·自动化测试·软件测试·python·功能测试·程序人生·职场和发展
ヽ格式化25 分钟前
Go与PHP变量声明全方位对比:从语法到性能的深度解析
golang·php
p***s9136 分钟前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
unclecss41 分钟前
从 0 到 1 落地 SSE:Spring Boot 3 实战 Server-Sent Events 推送全链路
java·spring boot·后端·http·sse
稚辉君.MCA_P8_Java1 小时前
DeepSeek Java 多线程打印的19种实现方法
java·linux·jvm·后端·架构
白露与泡影1 小时前
spring Security 认证流程闭环与调用链路详解
java·后端·spring