私はGolangにProtobufを使用しています。 Protobufは、タイプポインタがproto.Message()
を実装するメッセージタイプを生成します。例: boxed構造体をboxedポインタにキャスト - golang
func (*SomeMessage) Message() {}
いるProtobuf libには、私の実際の問題に今Marshal(proto.Message)
のようなメソッドを持っています。
上記の動作は問題ありません。 しかし、メッセージをポインタとして渡さないと、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
}
}
好ましく私はポインタとしておよび値の両方渡すことができるようにしたいと思います。私は値渡したい理由 理由は、など ゴルーチン/スレッド間でメッセージを渡すときに、これは(不変性の欠如で)貧しいマン分離として作用し得ることである
場合には、このすべては、おそらく避けることができますprotobufジェネレータは許容値をproto.Message()
としても扱うように生成しました。 または不変のメッセージを行うためのより良い方法があれば。
その可能ならばそのない場合、私はメッセージのreflect.Typeとのreflect.Typeを持っている場合は、[EDIT]
:-) MEH、、、、
クールスーパー重要ではありませんメッセージのポインタ型。 "reflect"を使用して値を指すポインタ型のインスタンスを作成することは、どういうわけかできますか?
ありがとうございます! –
@RogerAlsing私は、この作品は非常に遅く、過度に設計され、実際のプロジェクトでは使用すべきではないことを指摘したいと思います。 – OneOfOne
はい、私は、最高の解決策は、不変の構造体を生成するprotocを持っているだろうが、それは可能だったことを見て興味深かったです。 –