इसलिए प्रोटोकॉल बफ़र्स v3 और गो एक साथ (दोनों के लिए नया) का उपयोग करने का प्रयास कर रहे हैं।

example.proto

syntax = "proto3";

package test;

import "google/protobuf/timestamp.proto";

message Metadata {
    uint64 userID = 2;
    google.protobuf.Timestamp time= 3; 
}

//SignOff when user logs out of Glory
message SignOff {
    Metadata metadata =1;
}

//SignOn when user logs into Glory
message SignOn {
    Metadata metadata =1;
}

message EventWrapper {
    oneof event {
        SignOff signOff = 1;
        SignOn signOn = 2;
    }
}

protoc के साथ कनवर्ट करना और Go . में उपयोग करना

now, _ := ptypes.TimestampProto(time.Now())
event := &pb_test.EventWrapper{
    Event: &pb_test.EventWrapper_SignOn{
        SignOn: &pb_test.SignOn{
            Metadata: &pb_test.Metadata{
                UserID: 1234,
                Time:   now,
            },
        },
    },
}
protoBytes, err := proto.Marshal(event)
if err != nil {
    log.Fatal(err)
}
log.Println(len(protoBytes) == 0)

jsonBytes, _ = json.MarshalIndent(event, "", "\t")
log.Println(string(jsonBytes))

आउटपुट दिखाता है कि JSON सही है लेकिन प्रोटोबफ एन्कोडेड बाइट सरणी खाली है।

{
    "Event": {
        "SignOn": {
            "metadata": {
                "userID": 1234,
                "time": {
                    "seconds": 1491143507,
                    "nanos": 654053400
                }
            }
        }
    }
}

इरादा इनमें से एक सरणी है (repeated *EventWrapper) जीआरपीसी के माध्यम से तार के साथ भेजने के लिए, लेकिन इस समय व्यक्तिगत काम नहीं करते हैं। प्रोटोबफ भाषा गाइड में स्ट्रक्चर्स की अनुमति नहीं होने के बारे में कुछ नहीं कहा गया है। क्या मुझे कुछ याद आ रहा है?

5
Delaney 2 अप्रैल 2017, 17:43

1 उत्तर

सबसे बढ़िया उत्तर

प्रोटोकॉल बफ़र दस्तावेज़ में कुछ भी इंगित नहीं करता है कि oneof स्ट्रक्चर नहीं हो सकते हैं, और वास्तव में example जेनरेट करता है union फ़ील्ड के लिए संरचनाएँ।

मैं gogo का उपयोग करने की अनुशंसा करता हूं, जिसका मैंने व्यक्तिगत रूप से पिछले वाणिज्यिक परियोजनाओं के लिए उपयोग किया है। विशेष रूप से, use protoc-gen-gogoslick

आवश्यक पैकेज स्थापित करने के लिए यह अनुभाग देखें, फिर अपनी परियोजना के लिए निम्नलिखित चलाएँ:

protoc --gogoslick_out=Mgoogle/protobuf/timestamp.proto=github.com/gogo/protobuf/types:. example.proto
2
Stuart Carnie 8 अप्रैल 2017, 01:55