当前位置: 首页 > wzjs >正文

北京建站报价在网站开发中进行用户管理

北京建站报价,在网站开发中进行用户管理,金融网站策划,免费的logo在线设计背景 在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代…

背景

在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代码规范需求。

比如,团队可能有以下规范或诉求:

  • Go 结构体字段名需要使用特定的 PascalCase 命名规则;
  • JSON tag 必须统一为 snake_case,以与前端规范对齐;
  • 字段名称如 iduser_id等在 Go 代码中必须转换为IDUserID,以保持一致性和清晰性。

遗憾的是,protoc-gen-go 并没有提供原生的机制来满足这些细致的定制需求。因此,我们选择自定义 protoc-gen-go 插件的生成逻辑,以实现结构体字段命名的精细控制。

实现步骤

1. 获取protobuf-go源码

首先克隆指定版本的protobuf-go仓库:

git clone github.com/protocolbuffers/protobuf-go@v1.36.6

2. 定义全局参数

cmd/protoc-gen-go/internal_gengo/main.go文件中定义全局变量和常量:

var (IsCustomField bool   // 标识是否使用自定义字段命名TagJSONStyle  string // JSON标签命名风格
)const (SnakeCaseStyle = "snake_case"CamelCaseStyle = "camel_case"
)

3. 声明命令行参数

cmd/protoc-gen-go/main.go中添加参数解析逻辑:

// 定义option参数
isCustomField = flags.Bool("is_custom_field", false, "struct field naming style setting, default is false, indicates no modification, "+"if true indicates custom hump style, for example, message field name suffix "+"is _id or Id, struct field name suffix of generated go code is ID")tagJSONStyle = flags.String("tag_json_style", "", "struct field tag json naming style setting, default is empty, indicates no modification, "+"if set to 'snake_case', indicates snake case style, if set to 'camelCase', indicates camel case style. "+"NOTE: this option overrides protobuf's json_name option")// 判断参数是否合法
if *isCustomField {gengo.IsCustomField = true
}
if *tagJSONStyle != "" {if *tagJSONStyle != gengo.SnakeCaseStyle && *tagJSONStyle != gengo.CamelCaseStyle {return fmt.Errorf("protoc-gen-go: invalid tag_json_style value: %q, "+"must be 'camel_case' or'snake_case'", *tagJSONStyle)}gengo.TagJSONStyle = *tagJSONStyle
}

4. 添加命名转换工具

从nameFormat.go复制代码到cmd/protoc-gen-go/internal_gengo目录,并将函数名xstrings.ToCamelCase修改为xstrings.ToPascalCase

5. 修改字段生成逻辑

generateOneFile函数中添加自定义字段命名逻辑:

func generateOneFile(gen *protogen.Plugin, file *protogen.File, f *fileInfo, variant string) *protogen.GeneratedFile {// ......for _, message := range f.allMessages {// 添加的自定义字段名风格设置if IsCustomField {for _, field := range message.Fields {field.GoName = toCamel(field.GoName)}}genMessage(g, f, message)}// ......
}

6. 修改JSON标签生成逻辑

更新fieldJSONTagValue函数以支持自定义JSON标签风格:

func fieldJSONTagValue(field *protogen.Field) string {switch TagJSONStyle {case SnakeCaseStyle:return customToSnake(string(field.Desc.Name())) + ",omitempty"case CamelCaseStyle:return customToCamel(string(field.Desc.Name())) + ",omitempty"}return string(field.Desc.Name()) + ",omitempty" // default
}

使用示例

测试proto文件

使用以下user.proto文件进行测试:

syntax = "proto3";package api.user.v1;option go_package = "user/api/user/v1;v1";service user {// Login 登录rpc Login(LoginRequest) returns (LoginReply) {}
}message LoginRequest {string email = 1;string password = 2;
}message LoginReply {uint64 user_id =1;uint64 communityId=2;repeated uint64 roleIDs =3;string token =4;
}

生成命令对比

  1. 默认生成方式(与原始protobuf-go行为一致):
protoc --go_out=. --go_opt=paths=source_relative user.proto
  1. 自定义字段命名
protoc --go_out=. --go_opt=paths=source_relative --go_opt=is_custom_field=true user.proto
  1. 自定义字段命名+蛇形JSON标签
protoc --go_out=. --go_opt=paths=source_relative --go_opt=is_custom_field=true --go_opt=tag_json_style=snake_case user.proto

效果对比

默认生成的代码

type LoginReply struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserId      uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`CommunityId uint64 `protobuf:"varint,2,opt,name=communityId,json=communityId,proto3" json:"communityId,omitempty"`RoleIDs     []uint64 `protobuf:"varint,3,rep,packed,name=roleIDs,json=roleIDs,proto3" json:"roleIDs,omitempty"`Token       string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"`
}

自定义字段命名后的代码

type LoginReply struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserID      uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`CommunityID uint64 `protobuf:"varint,2,opt,name=communityId,json=communityId,proto3" json:"communityId,omitempty"`RoleIDs     []uint64 `protobuf:"varint,3,rep,packed,name=roleIDs,json=roleIDs,proto3" json:"roleIDs,omitempty"`Token       string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"`
}

自定义字段命名+蛇形JSON标签后的代码

type LoginReply struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsUserID      uint64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`CommunityID uint64 `protobuf:"varint,2,opt,name=communityId,json=communityId,proto3" json:"community_id,omitempty"`RoleIDs     []uint64 `protobuf:"varint,3,rep,packed,name=roleIDs,json=roleIDs,proto3" json:"role_ids,omitempty"`Token       string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"`
}

总结

通过修改protoc-gen-go源码,我们实现了以下功能:

  1. 统一结构体字段命名风格(如将ID后缀统一大写)
  2. 控制JSON标签的命名风格(蛇形或驼峰)
  3. 通过命令行参数灵活控制生成行为

这种定制化特别适合需要严格遵循特定代码规范的团队,可以确保生成的代码风格一致,减少人工修改的工作量。

注意事项

  1. 此修改基于protobuf-go v1.36.6版本,其他版本可能需要相应调整
  2. 自定义JSON标签风格会覆盖protobuf原生的json_name选项
  3. 建议团队内部统一使用规范,避免风格不一致

希望本文对需要自定义protobuf代码生成的开发者有所帮助!

http://www.dtcms.com/wzjs/826642.html

相关文章:

  • 要维护公司的网站该怎么做2024房地产彻底结束
  • 精品网站设计苏州平台公司
  • 招远网站建设厦门建设局怎么进
  • 友情下载网站php多版本共存wordpress
  • 建站售后服务logo设计在线生成免费商标图片
  • 网络电子商务购物网站建立网站目录结构时应注意哪几个方面?
  • 备案空壳网站学校网站建设规划
  • 做彩票网站服务器怎么做免费网站
  • wordpress 网站名称做网站公奇闻司郑州汉狮
  • 16岁的做兼职在什么网站好seo推广思路
  • 做网站加载速度有什么方法小新pro更改网站设置
  • 学做川菜的网站阿里云可以做电影网站吗
  • 英文定机票网站建设qqlist rss更新 wordpress
  • 网站建设网站制作有限做网站服务器可以挂到外地么
  • 宁国市网站建设衡水营销型网站建设
  • wordpress获取当前分类的子分类广西网站建设产品优化
  • 厅网站建设项目背景网站首页flash模板
  • 在线做动图的网站临安做企业网站的公司
  • 巴中建设银行网站安装2个wordpress
  • 怎么做家具定制网站网站子页面设计
  • 合江做网站品牌策划公司有哪些
  • 海南高端网站建设定制网页设计与制作教程书电子版
  • 建设网站后如何做后台网站建设规划ppt模板
  • 网站接入地优秀网页设计平台
  • 怎么做网站首页psd新网域名搭建网站
  • 郑州专业的网站建设招聘网站制作
  • 做网站推广费用网站多国语言
  • 网站的重要目录对百度进行了封禁松江新桥专业网站建设
  • 电脑公司网站源码宁波住房和城乡建设局网站首页
  • 中国中小企业网站建设现状wordpress qqlogin