如何在 Protocol Buffer 中使用自定义的字符串方法?

huangapple go评论92阅读模式
英文:

How to have custom String method in Protocol Buffer?

问题

假设我有一个类似的proto文件:

message Sample {
  Test t = 1;
}

message Test {
  string s = 1;
}

我想在Test类型上拥有自定义的String方法,但是由于protoc自动生成的代码已经包含了String方法,我的自定义String方法会导致编译错误。

值得一提的是,自动生成的String方法如下所示:

func (x *Test) String() string {
	return protoimpl.X.MessageStringOf(x)
}

上述代码只是打印值本身,但我想知道是否有任何方法可以使用我自定义的String实现呢?

英文:

Let's say I have a proto file like:

message Sample {
  Test t = 1;
}

message Test {
  string s = 1;
}

I want to have my own customize String method on type Test, but since the auto generated code of protoc already includes String method, my custom String method leads to a compiler error.

It is worth mentioning the auto generated String method is:

func (x *Test) String() string {
	return protoimpl.X.MessageStringOf(x)
}

The above code, just prints the value itself but I was wondering if there is any way which I can use my custom String implementation?

答案1

得分: 4

我认为你不应该操纵生成的 pb 文件,而是应该使用一个包装结构体。

type Wrapper struct{
   pb.Sample
}

func (w Wrapper) String() string{
  ...
}

我脑海中浮现的第二个选择是,你可以为 protoc 编写一个插件,并在给定需要使用这些方法的结构体标签时使用它们。

英文:

I don't think you should mess around with generated pb files and use a wrapper struct instead.

type Wrapper struct{
   pb.Sample
}

func (w Wrapper) String() string{
  ...
}

Second option that comes to my mind is that maybe you can write a plugin for protoc and make it use those methods when needed struct tag is given.

答案2

得分: -2

你可以直接替换*.pb.go文件中的实现部分。
然而,如果原始的proto文件在与修改后的文件相同的路径下编译,修改将会丢失。

英文:

You can replace the implementation in the *.pb.go file itself.
However, the change will be gone if the original proto file is compiled at the same path where the modified file is.

huangapple
  • 本文由 发表于 2021年6月3日 22:37:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/67823497.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定