【发布时间】:2016-04-26 12:04:41
【问题描述】:
我正在为 Golang 使用 Protobuf。
Protobuf 生成消息类型,其中类型指针实现proto.Message()。
例如
func (*SomeMessage) Message() {}
protobuf 库有 Marshal(proto.Message) 之类的方法
现在是我的实际问题。
message := SomeMessage {}
SendMessage(&message)
func SendMessage(message interface{}) {
switch msg := message.(type) {
case proto.Message:
//send across the wire or whatever
default:
//non proto message, panic or whatever
}
}
以上工作正常。 但是,如果我不将消息作为指针传递,那么 SendMessage 中的代码将不匹配,因为接口仅在 SomeMessage 指针上实现,而不是在值上实现。
我想做的是:
message := SomeMessage {}
SendMessage(message) //pass by value
//there are more stuff going on in my real code, but just trying to show the relevant parts
func SendMessage(message interface{}) {
//match both pointer and value as proto.Message
//and then turn the value into a pointer so that
//other funcs or protobuf can consume it
message = MagicallyTurnBoxedValueIntoBoxedStruct(message)
switch msg := message.(type) {
case proto.Message:
//send across the wire or whatever
default:
//non proto message, panic or whatever
}
}
最好我希望能够同时作为指针和值传递。 我想按值传递的原因是,当通过 goroutines/threads 等传递消息时,这可以作为一个糟糕的人隔离。 (缺乏不变性)
如果 protobuf 生成器生成的允许值也被视为proto.Message(),那么所有这些都可以避免。
或者,如果有更好的方法来处理不可变消息。
这不是很重要,如果可能的话,很酷,如果不是,嗯:-)
[编辑]
如果我有消息的 reflect.Type 和消息的指针类型的 reflect.Type。 是否有可能使用“反射”创建指向值的指针类型的实例?
【问题讨论】:
标签: go protocol-buffers