go c 通过内存原始二进制内容直接传递结构体

go c 通过内存原始二进制内容直接传递结构体

传统数据传输通常通过半结构化数据(json/yaml/xml...)来交换信息。但是go 支持 二进制数据层面支持c 结构体。带来的好处就是相较于半结构化数据类型来说更快(在go中,解析和生成json/yaml/xml...到结构体都会经过一层反射到结构体,数据单向流通会是1层反射,如果数据双向即生成又要解析那么就会用上2层反射).

而使用内存直接交换(在不涉及指针(由于指针只是一个记录硬件地址的一个地址,也叫做虚拟指针。只在单个进程中有效,到其它进程中只是一串毫无用处的占8位字节的数字uint64),字符串类型的情况下是非常快的).

此处直接书接上文[go 内存二进制数据操作]继续。类型定义不清楚的可以看那边文章.本文内存二进制数据采取直接写入和从文件中读出。若你想使用共享内存来代替,可参考我的文章[golang 操作共享内存]

go 复制代码
type SharePointer[T any] struct {
	*Pointer[T]
}

func (s *SharePointer[T]) Dump(w io.Writer) {
    _, err := w.Write(s.Bytes())
	if err != nil {
		panic("write to disk failed " + err.Error())
	}
}
//一个计数类型,占用8位字节
//在操作原始内存上推荐使用明确大小的类型.如使用int32 代替int,因为int随着系统的变换对应的位数在变动
type Count struct {
	A uint32
	B uint16
	C uint16
}

func NewSharePointer[T any]() *SharePointer[T] {
	return &SharePointer[T]{Pointer: NewPointer[T]()}
}
func main() {
	ptr := NewSharePointer[Count]()
	f, err := os.OpenFile("test.shm", os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		panic("open test.shm failed " + err.Error())
	}
    //修改一下数据
    ptr.Pointer.T.A = 23
	ptr.Pointer.T.B = 13
	ptr.Pointer.T.C = 23
	defer f.Close()
	ptr.Dump(f) //写入硬盘
	//从硬盘中读取
	fe, err := os.OpenFile("test.shm", os.O_RDONLY, 0640)
	if err != nil {
		panic("read test.shm failed " + err.Error())
	}
	defer fe.Close()
	_, err = fe.Read(ptr.Bytes())
	if err != nil {
		panic("read test.shm failed " + err.Error())
	}
	fmt.Println(*ptr.T)
}

c 操作

c 操作很简单,直接将结果体指针写入文件,读取也是一样

c 复制代码
#include <stdint.h>
#include <unistd.h>
struct __count{
    uint32_t a;
    uint16_t b;
    uint16_t c;
};
int main(){
    struct __count count;
    //....
    write(fd,&count,sizeof(count));
    read(fd,&count,sizeof(count));
    //....
}
相关推荐
Gu Gu Study6 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
时光の尘20 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-29 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
以后不吃煲仔饭34 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师35 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者39 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟41 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用1 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net