我需要使用现有的 C++ 支持的 protobuf 服务器(需要与 unix 套接字连接)来接收 protobuf 请求。我想使用 golang 作为 protobuf 客户端向服务器发送请求。但是我发现 C++ 和 golang 中自动生成的消息定义是不同的。在 ::google::protobuf::Message 的 C++ 版本的 protobuf 中有更多定义。我使用以下命令根据相同的 proto 定义生成 c++ protobuf 定义:
protoc --proto_path=src --cpp_out=. src/sample.proto
protoc --proto_path=src --go_out=. src/sample.proto
但是使用生成的sample.pb.cc、sample.pb.h和sample.pb.go,golang客户端消息格式是c++服务器无法识别的。
有没有办法让这个 golang 客户端 c++ 服务器 protobuf 通信工作?谢谢。
============================ 2021.1.6更新:在此处添加示例:
目录结构:
test
├── test.pb.cc
├── test.pb.go
├── test.pb.h
└── test.proto
原型文件:
syntax = "proto2";
option go_package = "./;test";
package test;
message test {
required uint64 key = 1;
}
protoc 命令生成 test.pb.go、test.pb.h、test.ph.cc 文件:
protoc --proto_path=test --cpp_out=test test/test.proto
protoc --proto_path=test --go_out=test test/test.proto
然后可以在test.pb.go中看到golang生成的数据结构:
type Test struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Key *uint64 `protobuf:"varint,1,req,name=key" json:"key,omitempty"`
}
C++生成的数据结构:
class test : public ::google::protobuf::Message {
... // I'll ignore function definition
static const int kKeyFieldNumber = 1;
::google::protobuf::UnknownFieldSet _unknown_fields_;
::google::protobuf::uint64 key_;
mutable int _cached_size_;
::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];
static test* default_instance_;
}
这两者似乎不匹配......例如,_has_bits_
字段类型在c ++生成的代码中起着重要作用,而在golang生成的代码中没有相关的逻辑。
// required uint64 key = 1;
inline bool test::has_key() const {
return (_has_bits_[0] & 0x00000001u) != 0;
}
inline void test::set_has_key() {
_has_bits_[0] |= 0x00000001u;
}
inline void test::clear_has_key() {
_has_bits_[0] &= ~0x00000001u;
}
inline void test::clear_key() {
key_ = GOOGLE_ULONGLONG(0);
clear_has_key();
}
inline ::google::protobuf::uint64 test::key() const {
return key_;
}
inline void test::set_key(::google::protobuf::uint64 value) {
set_has_key();
key_ = value;
}