问题描述
在读一段 C++ 代码,并想要用 Go 重写其逻辑。C++ 的相关代码是这样的:
std::stringstream buffer;
valhalla::baldr::TrafficTileHeader header = {}; // 这是一个 struct
// 此处省略若干字段赋值
header.last_update = last_update_timestamp;
buffer.write(reinterpret_cast<char*>(&header), sizeof(header));
这段代码的作用简单来说是创建一个 header 对象(不熟 C++,不知道这么称呼是否正确?),对其中的字段进行一些赋值后写到一个 stringstream 里。后续会把这个 buffer 写入文件。
我在尝试用 Go 重写这个过程,目的是产生相同格式的文件,让另外一个程序读取。我的关键代码如下:
buf := &bytes.Buffer{}
header := TrafficTileHeader{
// 省略若干字段赋值
LastUpdate: uint64(time.Now().Unix()),
}
binary.Write(buf, binary.BigEndian, header)
然后把 buf 的内容写入一个文件。在文本编辑器中比较 C++ 和 Go 输出的文件,虽然内容是二进制,但字符结构看起来结构差异非常大,目标程序无法识别 Go 输出的文件。
疑问
- 用 Go 实现的思路是否合理?
- Go 是否有和
reinterpret_cast<char*>(&header)等价的操作,从而得到一致的结果?
参考
上文 C++ 代码段所在的源文件:
谢谢各位耐心阅读!🙏