偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

為什么 Go 官方 Protobuf 不支持標簽注入?有替代方案 ?

開發(fā) 前端
在 Go 生態(tài)系統(tǒng)中,gogo/protobuf?曾是官方?golang/protobuf?的強力替代方案,提供了許多增強功能。然而這個項目已在兩年前被標記為廢棄(Deprecated),作者最終放棄了維護。

背景:gogo/protobuf 的興衰

在 Go 生態(tài)系統(tǒng)中,gogo/protobuf 曾是官方 golang/protobuf 的強力替代方案,提供了許多增強功能。然而這個項目已在兩年前被標記為廢棄(Deprecated),作者最終放棄了維護。

其中最讓作者和社區(qū)失望的,是官方 Protobuf 庫始終拒絕支持的一個關(guān)鍵功能——標簽注入。這一功能正是許多開發(fā)者選擇 gogo/protobuf 的主要原因。

什么是標簽注入功能?

標簽注入允許開發(fā)者在 .proto 文件中直接定義生成 Go 結(jié)構(gòu)體時的字段標簽(如 JSON tag)。這是 gogo/protobuf 擴展的核心功能之一。

功能示例

考慮以下 Protobuf 定義:

message Person {
    string name =1;
    int32 id =2[(gogoproto.jsontag)="id"];// 自定義JSON標簽
    string email =3;

    enum PhoneType{
        MOBILE =0;
        HOME =1;
        WORK =2;
    }

    message PhoneNumber{
        string number =1;
        PhoneType type =2;
    }

    repeated PhoneNumber phones =4;
    google.protobuf.Timestamp last_updated =5;
}

使用 gogo/protobuf 生成的 Go 代碼:

type Person struct{
     Name        string`protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
     Id          int32`protobuf:"varint,2,opt,name=id,proto3" json:"id"`// 注意沒有omitempty
     Email       string`protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"`
     Phones      []*Person_PhoneNumber  `protobuf:"bytes,4,rep,name=phones,proto3" json:"phones,omitempty"`
     LastUpdated *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_updated,jsnotallow=lastUpdated,proto3" json:"last_updated,omitempty"`
}

可以看到 Id 字段的 JSON tag 被自定義為 "id",并且移除了 omitempty 標簽,這在某些 API 設計中非常有用。

官方為何拒絕支持?

盡管社區(qū)強烈要求,golang/protobuf 團隊始終明確拒絕添加這一功能。主要原因包括:

  1. 語言中立性原則:官方 Protobuf 實現(xiàn)旨在不與特定編程語言強綁定。標簽注入是 Go 特有的需求,其他語言可能無法有效利用這一特性。
  2. 維護邊界:官方認為這類功能超出了核心 Protobuf 庫的職責范圍,更適合由第三方插件或工具實現(xiàn)。
  3. 設計哲學:官方更傾向于保持核心庫的簡潔性和穩(wěn)定性,而非不斷增加語言特定的擴展。

替代方案推薦

雖然 gogo/protobuf 已廢棄,但仍有其他選擇:

1. 繼續(xù)使用 gogo/protobuf

盡管不再維護,但對于已有項目仍可繼續(xù)使用。

2. 使用 protoc-go-inject-tag

這是一個專門用于標簽注入的工具,職責單一且維護良好。

示例使用:

message IP{
    // @gotags: valid:"ip"
    string Address =1;

    string MAC =2;// @gotags: validate:"omitempty"
}

生成代碼:

type IP struct{
     Address string`protobuf:"bytes,1,opt,name=Address" json:"Address,omitempty" valid:"ip"`
     MAC     string`protobuf:"bytes,2,opt,name=MAC" json:"MAC,omitempty" validate:"omitempty"`
}

總結(jié)與啟示

  1. 官方立場明確:golang/protobuf 堅持語言中立原則,不愿支持 Go 特有功能
  2. 生態(tài)多樣性:社區(qū)需求催生了 gogo/protobuf 等替代方案,填補了官方庫的空白
  3. 維護可持續(xù)性:單一職責的工具如 protoc-go-inject-tag 可能比龐大的一站式方案更易維護
  4. 技術(shù)決策權(quán)衡:在選擇 Protobuf 工具鏈時,需在功能豐富性和長期維護性間取得平衡

這一案例也反映了開源生態(tài)中常見的情況:官方項目保持克制,而社區(qū)填補特定需求。開發(fā)者需要根據(jù)項目需求做出合適的技術(shù)選擇。

責任編輯:武曉燕 來源: Go語言圈
相關(guān)推薦

2025-06-26 02:22:00

GoProtobuf標簽

2024-05-28 08:55:52

2021-10-27 07:15:36

Go 循環(huán)引用

2021-12-09 10:51:47

Go繼承

2021-12-15 07:49:22

Go語言設計

2023-01-28 08:05:32

轉(zhuǎn)換Go泛型

2024-01-05 08:45:35

Go語言map

2024-01-01 08:10:40

Go語言map

2021-11-08 11:02:01

Go函數(shù)重載

2023-02-26 23:36:08

PHPGo函數(shù)

2024-03-08 08:51:59

Gomain函數(shù)

2020-10-09 06:48:19

Pythonswitch語句

2020-07-22 08:01:41

Python開發(fā)運算符

2024-03-12 09:13:28

Go語言main

2021-02-01 13:53:53

StringlongJava

2021-06-11 00:03:31

鴻蒙智能手機

2009-03-12 08:42:38

AndroidWMMTK

2021-08-02 09:31:20

Python工具代碼

2023-04-03 11:21:29

PythonGoRust

2021-07-13 08:09:34

微博推特評論
點贊
收藏

51CTO技術(shù)棧公眾號