32

json プロキシで google grpc を使用しています。何らかの理由omitemptyで、*.pb.go ファイルで生成された構造体からタグを削除する必要があります。

このようなプロトメッセージがある場合

message Status {
  int32 code = 1;
  string message = 2;
}

生成された構造体は次のようになります

type Status struct {
  Code int32 `protobuf:"varint,1,opt,name=code" json:"code,omitempty"`
  Message string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"`
}

omitemptyしかし、生成された構造体からタグを削除する必要があります。これどうやってするの?

4

8 に答える 8

12

[より] ポータブルなソリューション:

sedを介して生成した後にタグを削除するために使用しますprotoc

*.pb.go ファイルを生成した後、go:generate スクリプトで実際に使用する例:

ls *.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}'

注: sed -i(インライン置換) は、標準の OS-X と Linux の間で移植できないため、ここでは使用されません。

于 2016-05-19T23:05:45.970 に答える
7

omitemptyjson タグが protoc-gen-goソースの 1778 行付近にハードコードされていることがわかりました。

tag := fmt.Sprintf("protobuf:%s json:%q",
    g.goTag(message, field, wiretype), jsonName+",omitempty")

ソースを変更して、新しい protoc-gen-go バイナリを自分で作成するのは簡単です。

特に、protobuf を再生成する必要がある場合に、ハッキングされたバイナリが常に使用されるようにする責任があるため、これはお勧めできない可能性が高く、いくつかの理由で推奨されないことに注意してください。

于 2016-01-12T01:42:01.097 に答える
1

「sed」コマンドを使用して、次のようにファイルからこのテキストを削除できます

sed -i "" -e "s/,omitempty//g" ./api/proto/*.go

引数:

  1. -i ""同じ名前のファイルを保持することを意味しています
  2. -e "s/,omitempty//g"= 置換する形式"s/SEARCH/INSERT/g"
于 2019-10-27T13:43:11.000 に答える