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

destoon做的网站网站建设与设计教程

destoon做的网站,网站建设与设计教程,网站明确内容,洛阳做网站公司地址大家好#xff0c;我是peachesTao#xff0c;今天给大家推荐一个go的支持多语言的error自动生成的插件#xff0c;插件主页可以访问下方链接。 在一个多语言国际化的项目中#xff0c;后端接口返回给前端的错误描述也需要国际化#xff0c;我们来看一下后端给前端返回多语…大家好我是peachesTao今天给大家推荐一个go的支持多语言的error自动生成的插件插件主页可以访问下方链接。 在一个多语言国际化的项目中后端接口返回给前端的错误描述也需要国际化我们来看一下后端给前端返回多语言错误描述的实现方式有哪些。 常规实现 服务端将错误码和不同语言的错误描述硬编码在代码中通过前端从http head中传过来的language来决定是返回中文还是英文。 1、定义Error结构体 该结构体实现标准库的error接口实现自定义error type Error struct {Code intMsg string }func (e *Error) Error() string {return fmt.Sprintf(%d,%s, e.Code, e.Msg) }2、定义错误码和错误描述map const (Err_Code_Success 0Err_Code_UnKnown -1Err_Code_InValid_Phone 10001 )const (Language_Chinese 0 //中文Language_Enligh 1 //英文 )//不同语言对应的错误描述 var errMap map[int]map[int]string{Language_Chinese: {Err_Code_Success: 成功,Err_Code_InValid_Phone: 手机号格式不正确,Err_Code_UnKnown: 未知错误,},Language_Enligh: {Err_Code_Success: success,Err_Code_InValid_Phone: invalid phone no,Err_Code_UnKnown: unknown err,}, }3、申明一个用户注册的api 根据客户端传过来的http header中的language的值决定返回中文还是英文的错误描述 func main() {http.HandleFunc(/user/register, func(w http.ResponseWriter, r *http.Request) {languageStr : r.Header.Get(language)language, _ : strconv.Atoi(languageStr)values, _ : url.ParseQuery(r.URL.RawQuery)phone : values[phone][0]err : checkPhone(phone)response(w, language, err)})http.ListenAndServe(:8080, nil) }func response(w http.ResponseWriter, language int, err error) {e : Error{Code: Err_Code_Success}if err ! nil {var ok boolif e, ok err.(*Error); !ok {e Error{Code: Err_Code_UnKnown}}}msg : errMap[language][e.Code]res : make(map[string]interface{})res[code] e.Coderes[msg] msgjson, _ : json.Marshal(res)w.WriteHeader(200)w.Write(json) }func checkPhone(phoneNo string) error {if len(phoneNo) ! 11 {return Error{Code: Err_Code_InValid_Phone}}return nil }我们通过curl命令来看看效果 语言设置为中文时 curl -H language:0 http://127.0.0.1:8080/user/register?phone187111111112 {code:10001,msg:手机号格式不正确}语言设置为英文时 curl -H language:1 http://127.0.0.1:8080/user/register?phone187111111112 {code:10001,msg:invalid phone no}这种实现方式确实能满足业务需求但是有下面几个缺点 当要将手机号格式不正确的描述改时需要修改代码当添加新的错误时需要改动多个地方代码添加新的错误码和在errMap中添加对应语言的错误描述容易遗漏当添加新的语言时要向errMap添加所有错误码的新语言错误描述容易遗漏 一旦涉及到修改代码就存在出现bug的风险有没有一种更优雅的方案尽量减少修改代码 有人会想到将错误描述放在json文件中维护这种方案只是在修改错误描述时比较便利不需要改动业务代码但在新增错误和新语言时存在同样的问题。 下面我们来看看通过go-error-generator插件的方法来实现 更优雅的实现 go-error-generator是一个通过protobuf文件的Enum对象自动生成Error的插件通过在扩展的EnumValueOptions中定义多个option轻松实现error的多语言。 它包含如下功能 根据Enum定义的errCode和msg自动生成error;支持定义多个EnumValueOption实现多语言;支持error合并功能;支持自定义Error结构体、error Code和Msg的名称; 关于插件的原理和其他细节可以访问github主页了解。 我们回到刚才那个需求用插件的方式怎么实现错误多语言 1、定义error模板 删除代码中的的Error结构体取代的是在protobuf中定义新建一个protobuf文件取名为error.proto在这里自定义error结构体和语言标识。 其中 msg:默认的语言标识在错误码定义文件中没有定义其他语言的错误描述时就用它的错误描述msg_english:英文标识当然你也可以取别的名字 syntax proto3; package errors; option go_package github.com/classtorch/go-error-generator-examples/internal/errors; import google/protobuf/descriptor.proto;message Error {int32 code 1;string msg 2; }; extend google.protobuf.EnumValueOptions {string msg 1108;string msg_english 1109; }2、定义错误码和错误描述 新建一个protobuf文件取名为account.proto 导入上面定义好的error.proto,自定义msg和msg_english对应的错误描述 syntax proto3; package uclass.service.account; option go_package /golang/account; import errors/errors.proto;enum ErrorCode {SUCCESS 0 [(errors.msg) 成功, (errors.msg_english) success]; // 成功UnKnown -1 [(errors.msg) 未知错误, (errors.msg_english) unknown err]; // 账号不存在InValid_Phone 10001 [(errors.msg) 手机号格式不正确, (errors.msg_english) invalid phone no]; // 登录失效请重新登录 }3、通过插件生成代码 该插件需要安装go和protobuf运行环境 goprotocprotoc-gen-go 安装好运行环境后再安装go-error-generator插件 go install github.com/classtorch/go-error-generator/protoc-gen-go-error-generator安装好后执行下面脚本生成代码 protoc --go-error-generator_out:. \--go-error-generator_opt descriptor_fileerrors/errors.proto \--go-error-generator_opt merge_errorfalse \--go-error-generator_opt merge_error_pathgolang/errors \--go_out. -I . account.proto插件自动生成的代码如下包含error对象和error map var (SUCCESS errors.Error{Code: 0, Msg: 成功} //成功UnKnown errors.Error{Code: -1, Msg: 未知错误} //未知错误InValid_Phone errors.Error{Code: 10001, Msg: 手机号格式不正确} //手机号格式不正确 )var (Msg map[int32]*errors.Error{0: errors.Error{Code: 0, Msg: 成功},-1: errors.Error{Code: -1, Msg: 未知错误},10001: errors.Error{Code: 10001, Msg: 手机号格式不正确},}Msg_English map[int32]*errors.Error{0: errors.Error{Code: 0, Msg: success},-1: errors.Error{Code: -1, Msg: unknown err},10001: errors.Error{Code: 10001, Msg: invalid phone no},} )4、使用生成的error对象 使用生成的error对象和error map改写response和checkPhone方法 func response(w http.ResponseWriter, language int, err error) {e : account.SUCCESSvar ok boolif err ! nil {if e, ok err.(*errors.Error); !ok {e account.UnKnown}}if language Language_Chinese {if e, ok account.Msg[e.Code]; !ok {e account.UnKnown}} else if language Language_Enligh {if e, ok account.Msg_English[e.Code]; !ok {e account.UnKnown}}res : make(map[string]interface{})res[code] e.Coderes[msg] e.Msgjson, _ : json.Marshal(res)w.WriteHeader(200)w.Write(json) }func checkPhone(phoneNo string) error {if len(phoneNo) ! 11 {return account.InValid_Phone}return nil }完整的代码可以访问go-error-generator-examples项目进行了解 我们来看下这是实现方式的优点 当我们需要修改某个错误描述时直接在account.proto文件中修改无须修改代码当需要增加新的错误时直接在account.proto文件中定义生成代码后直接在业务代码中引用即可当添加新的语言时只需要在error.proto中增加新的语言标识即然后在account.proto中引入即可 可以看出对于第一个和和第三个需求来说只需要修改protobuf文件重新生成代码就可以无须修改业务代码。第二个需求也只是简单的引入新的错误对象。 由于该插件是基于protobuf实现的如果项目中没有使用prorobuf技术栈的话会带来一些引入成本。不过这点成本相对于频繁修改业务代码还是值得的。 相关链接 go-error-generator go-error-generator-examples
http://www.w-s-a.com/news/425384/

相关文章:

  • 个人微信公众号怎么做微网站吗湛江网站制作方案
  • 学校网站改版南京展厅设计装修
  • 手机网站有免费做的吗建设银行网站不能登录
  • 树莓派做影视网站网站建设企业 熊账号
  • 网站iis7.5配置免费网站建设模板下载
  • 生物公司网站建设方案wordpress自定义字段调用
  • 静态网站公用头部如何调用标题wordpress自动采集翻译插件怎么用
  • 网站做单链 好不好网站营销不同阶段的网站分析目标
  • 网线制作颜色顺序兰州网站推广优化
  • 北京沙河教做网站的企业融资以什么为基础
  • 给网站添加百度地图绵阳做绵阳做网站网站
  • 用电脑做服务器制作网站东莞营销网站建设
  • 网站需要怎么做wordpress 重装
  • 做电影网站赚钱的方法世界500强企业排名2023
  • 领卷网站怎么做的西宁设计网站建设
  • 东莞网站建设价位软件开发税率是13%还是6
  • 企业网站建设一条龙如何在网上推广自己
  • 成品网站制作公司企梦网站建设
  • 网站开发微信授权登录ftp 如何 更新 wordpress
  • icp备案和网站不符查询公司的网站备案
  • 万江营销型网站建设泰安网站建设制作电话号码
  • 做网站是用ps还是ai服饰东莞网站建设
  • 只做一页的网站多少钱网站开发就业趋势
  • 陈村网站建设有哪些网站可以做店面设计
  • 查询网站注册信息wordpress 照片墙
  • 成都网站设计服务商室内设计设计师网站推荐
  • 企业建站系统cms百度网址ip
  • wordpress 代码编辑插件下载搜索引擎优化seo课程总结
  • 韩都衣舍网站建设的改进邯郸公众号小程序制作
  • 上海设计网站建设在线视频制作