dongliao9018
2018-05-22 09:27
浏览 560
已采纳

如何使用Golang设置Protobuf2枚举

I'm trying to use protobuf2 enums in golang but I cannot figure it out.

I created a simple protobuf file:

syntax         =          "proto2" ;
package                    enum    ;
message Foo{
     enum Bar{
         LOL = 1;
     }
     optional Bar baz = 1;
}

And I created a simple golang file:

package main

import (
    enum "./enum"
    "github.com/golang/protobuf/proto"
)

func main() {
    msg := &enum.Foo{
        Baz: enum.Foo_LOL,
    }
    proto.Marshal(&msg)
}

I got an error.

./foo.go:10: cannot use enum.Foo_LOL (type enum.Foo_Bar) as type *enum.Foo_Bar in field value

It seemed simple enough to solve, just add a & in front of enum.Foo_Bar.

package main

import (
    enum "./enum"
    "github.com/golang/protobuf/proto"
)

func main() {
    msg := &enum.Foo{
        Baz: &enum.Foo_LOL,
    }
    proto.Marshal(&msg)
}

Nope:

./foo.go:10: cannot take the address of enum.Foo_LOL

I searched google and found this guy being trolled by a bot. He had some working code, but it was verbose enough to bore a bible scholar:

package main

import (
    enum "./enum"
    "github.com/golang/protobuf/proto"
)

var lolVar = enum.Foo_LOL

func main() {
    msg := &enum.Foo{
        Baz: &lolVar,
    }
    proto.Marshal(msg)
}

I looked in the generated code and found an Enum method, which also worked, but was verbose enough to bore a tax auditor:

package main

import (
    enum "./enum"
    "github.com/golang/protobuf/proto"
)

func main() {
    msg := &enum.Foo{
        Baz: enum.Foo_LOL.Enum(),
    }
    proto.Marshal(msg)
}

What is the intended method?

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

相关推荐 更多相似问题