成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么 Go 官方 Protobuf 不支持標簽注入?全面剖析與替代方案

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

背景:gogo/protobuf 的興衰

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

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

什么是標簽注入功能?

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

功能示例

考慮以下 Protobuf 定義:

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

enumPhoneType{
    MOBILE =0;
    HOME =1;
    WORK =2;
}

messagePhoneNumber{
string number =1;
PhoneType type =2;
}

repeatedPhoneNumber 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,json=lastUpdated,proto3" json:"last_updated,omitempty"`
}

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

官方為何拒絕支持?

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

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

替代方案推薦

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

1. 繼續使用 gogo/protobuf

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

2. 使用 protoc-go-inject-tag

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

示例使用:

messageIP{
// @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"`
}

總結與啟示

官方立場明確:golang/protobuf 堅持語言中立原則,不愿支持 Go 特有功能

生態多樣性:社區需求催生了 gogo/protobuf 等替代方案,填補了官方庫的空白

維護可持續性:單一職責的工具如 protoc-go-inject-tag 可能比龐大的一站式方案更易維護

技術決策權衡:在選擇 Protobuf 工具鏈時,需在功能豐富性和長期維護性間取得平衡

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

責任編輯:武曉燕 來源: GO語言圈
相關推薦

2024-05-28 08:55:52

2021-10-27 07:15:36

Go 循環引用

2021-12-09 10:51:47

Go繼承

2021-12-15 07:49:22

Go語言設計

2023-01-28 08:05:32

轉換Go泛型

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2021-11-08 11:02:01

Go函數重載

2023-02-26 23:36:08

PHPGo函數

2024-03-08 08:51:59

Gomain函數

2020-07-22 08:01:41

Python開發運算符

2020-10-09 06:48:19

Pythonswitch語句

2024-03-12 09:13:28

Go語言main

2021-02-01 13:53:53

StringlongJava

2009-03-12 08:42:38

AndroidWMMTK

2021-06-11 00:03:31

鴻蒙智能手機

2021-08-02 09:31:20

Python工具代碼

2023-04-03 11:21:29

PythonGoRust

2021-07-13 08:09:34

微博推特評論

2009-03-11 17:32:22

聯發科WMAndroid
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频二区 | 国产精品永久免费视频 | 欧美精品一区在线发布 | 天天草夜夜骑 | 一区二区影院 | 欧美伊人影院 | h视频亚洲| 日韩免费视频一区二区 | 国产yw851.c免费观看网站 | 久久69精品久久久久久久电影好 | 国产精品福利网站 | www.黄色片视频 | 日韩一区二区黄色片 | 久久亚洲欧美日韩精品专区 | 99久久精品免费 | 日韩在线一区二区 | 精品久久久久久久久久久久久久 | 成人永久免费 | 久久久久黄色 | 久久精品国产精品青草 | 亚洲精品在线视频 | av片在线观看 | 国产一级片在线播放 | 国产欧美日韩精品一区二区三区 | 成人特区| 日韩一区二区av | 亚洲国产精品网站 | 精品久久网| 国产精品视频区 | 成人午夜视频在线观看 | 999视频在线播放 | 日韩中文字幕视频在线观看 | 国产精品99久久久精品免费观看 | 国产精品99久久久久久久久 | 狠狠的日 | 日本三级在线视频 | 91精品国产综合久久久亚洲 | 午夜国产精品视频 | 91免费看片 | 久热国产精品视频 | 在线观看免费毛片 |