国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一個(gè)go的支持多語(yǔ)言的error自動(dòng)生成插件

這篇具有很好參考價(jià)值的文章主要介紹了一個(gè)go的支持多語(yǔ)言的error自動(dòng)生成插件。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

大家好,我是peachesTao,今天給大家推薦一個(gè)go的支持多語(yǔ)言的error自動(dòng)生成的插件,插件主頁(yè)可以訪問(wèn)下方鏈接。

在一個(gè)多語(yǔ)言國(guó)際化的項(xiàng)目中,后端接口返回給前端的錯(cuò)誤描述也需要國(guó)際化,我們來(lái)看一下后端給前端返回多語(yǔ)言錯(cuò)誤描述的實(shí)現(xiàn)方式有哪些。

常規(guī)實(shí)現(xiàn)

服務(wù)端將錯(cuò)誤碼和不同語(yǔ)言的錯(cuò)誤描述硬編碼在代碼中,通過(guò)前端從http head中傳過(guò)來(lái)的language來(lái)決定是返回中文還是英文。

1、定義Error結(jié)構(gòu)體

該結(jié)構(gòu)體實(shí)現(xiàn)標(biāo)準(zhǔn)庫(kù)的error接口,實(shí)現(xiàn)自定義error

type Error struct {
	Code int
	Msg  string
}

func (e *Error) Error() string {
	return fmt.Sprintf("%d,%s", e.Code, e.Msg)
}

2、定義錯(cuò)誤碼和錯(cuò)誤描述map

const (
	Err_Code_Success       = 0
	Err_Code_UnKnown       = -1
	Err_Code_InValid_Phone = 10001
)

const (
	Language_Chinese = 0 //中文
	Language_Enligh  = 1 //英文
)

//不同語(yǔ)言對(duì)應(yīng)的錯(cuò)誤描述
var errMap = map[int]map[int]string{
	Language_Chinese: {
		Err_Code_Success:       "成功",
		Err_Code_InValid_Phone: "手機(jī)號(hào)格式不正確",
		Err_Code_UnKnown:       "未知錯(cuò)誤",
	},
	Language_Enligh: {
		Err_Code_Success:       "success",
		Err_Code_InValid_Phone: "invalid phone no",
		Err_Code_UnKnown:       "unknown err",
	},
}

3、申明一個(gè)用戶注冊(cè)的api

根據(jù)客戶端傳過(guò)來(lái)的http header中的language的值決定返回中文還是英文的錯(cuò)誤描述

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 bool
		if e, ok = err.(*Error); !ok {
			e = &Error{Code: Err_Code_UnKnown}
		}
	}
	msg := errMap[language][e.Code]
	res := make(map[string]interface{})
	res["code"] = e.Code
	res["msg"] = msg
	json, _ := 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
}

我們通過(guò)curl命令來(lái)看看效果

語(yǔ)言設(shè)置為中文時(shí):

curl -H "language:0" "http://127.0.0.1:8080/user/register?phone=187111111112"
{"code":10001,"msg":"手機(jī)號(hào)格式不正確"}

語(yǔ)言設(shè)置為英文時(shí):

curl -H "language:1" "http://127.0.0.1:8080/user/register?phone=187111111112"
{"code":10001,"msg":"invalid phone no"}

這種實(shí)現(xiàn)方式確實(shí)能滿足業(yè)務(wù)需求,但是有下面幾個(gè)缺點(diǎn):

  • 當(dāng)要將手機(jī)號(hào)格式不正確的描述改時(shí)需要修改代碼
  • 當(dāng)添加新的錯(cuò)誤時(shí)需要改動(dòng)多個(gè)地方代碼:添加新的錯(cuò)誤碼和在errMap中添加對(duì)應(yīng)語(yǔ)言的錯(cuò)誤描述,容易遺漏
  • 當(dāng)添加新的語(yǔ)言時(shí)要向errMap添加所有錯(cuò)誤碼的新語(yǔ)言錯(cuò)誤描述,容易遺漏

一旦涉及到修改代碼就存在出現(xiàn)bug的風(fēng)險(xiǎn)。

有人會(huì)想到將錯(cuò)誤描述放在json文件中維護(hù),這種方案只是在修改錯(cuò)誤描述時(shí)比較便利,不需要改動(dòng)業(yè)務(wù)代碼,但在新增錯(cuò)誤和新語(yǔ)言時(shí)存在同樣的問(wèn)題。

還有一種方案是通過(guò)翻譯包將文本翻譯為目標(biāo)語(yǔ)言,但這種方法翻譯的結(jié)果不可控,且性能比較低。

有沒(méi)有一種更優(yōu)雅的方案,盡量減少修改代碼,且有足夠的靈活性?

下面我們來(lái)看看通過(guò)go-error-generator插件的方法來(lái)實(shí)現(xiàn)

更優(yōu)雅的實(shí)現(xiàn)

go-error-generator是一個(gè)通過(guò)protobuf文件的Enum對(duì)象自動(dòng)生成Error的插件,通過(guò)在擴(kuò)展的EnumValueOptions中定義多個(gè)option輕松實(shí)現(xiàn)error的多語(yǔ)言。

它包含如下功能:

  • 根據(jù)Enum定義的errCode和msg自動(dòng)生成error;
  • 支持定義多個(gè)EnumValueOption,實(shí)現(xiàn)多語(yǔ)言;
  • 支持error合并功能;
  • 支持自定義Error結(jié)構(gòu)體、error Code和Msg的名稱;

關(guān)于插件的原理和其他細(xì)節(jié)可以訪問(wèn)github主頁(yè)了解。

我們回到剛才那個(gè)需求,用插件的方式怎么實(shí)現(xiàn)錯(cuò)誤多語(yǔ)言

1、定義error模板

刪除代碼中的的Error結(jié)構(gòu)體,取代的是在protobuf中定義,新建一個(gè)protobuf文件,取名為error.proto,在這里自定義error結(jié)構(gòu)體和語(yǔ)言標(biāo)識(shí)。

其中:

  • msg:默認(rèn)的語(yǔ)言標(biāo)識(shí),在錯(cuò)誤碼定義文件中沒(méi)有定義其他語(yǔ)言的錯(cuò)誤描述時(shí)就用它的錯(cuò)誤描述
  • msg_english:英文標(biāo)識(shí),當(dāng)然你也可以取別的名字
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、定義錯(cuò)誤碼和錯(cuò)誤描述

新建一個(gè)protobuf文件,取名為account.proto
導(dǎo)入上面定義好的error.proto,自定義msg和msg_english對(duì)應(yīng)的錯(cuò)誤描述

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) = "未知錯(cuò)誤", (errors.msg_english) = "unknown err"]; // 賬號(hào)不存在
  InValid_Phone = 10001 [(errors.msg) = "手機(jī)號(hào)格式不正確", (errors.msg_english) = "invalid phone no"];  // 登錄失效,請(qǐng)重新登錄
}

3、通過(guò)插件生成代碼

該插件需要安裝go和protobuf運(yùn)行環(huán)境

  • go
  • protoc
  • protoc-gen-go

安裝好運(yùn)行環(huán)境后再安裝go-error-generator插件

go install github.com/classtorch/go-error-generator/protoc-gen-go-error-generator

安裝好后執(zhí)行下面腳本生成代碼

protoc --go-error-generator_out=:. \
 --go-error-generator_opt descriptor_file=errors/errors.proto \
 --go-error-generator_opt merge_error=false \
 --go-error-generator_opt merge_error_path=golang/errors \
 --go_out=. -I . account.proto

插件自動(dòng)生成的代碼如下,包含error對(duì)象和error map

var (
	SUCCESS       = &errors.Error{Code: 0, Msg: "成功"}           //成功
	UnKnown       = &errors.Error{Code: -1, Msg: "未知錯(cuò)誤"}        //未知錯(cuò)誤
	InValid_Phone = &errors.Error{Code: 10001, Msg: "手機(jī)號(hào)格式不正確"} //手機(jī)號(hào)格式不正確
)

var (
	Msg = map[int32]*errors.Error{
		0:     &errors.Error{Code: 0, Msg: "成功"},
		-1:    &errors.Error{Code: -1, Msg: "未知錯(cuò)誤"},
		10001: &errors.Error{Code: 10001, Msg: "手機(jī)號(hào)格式不正確"},
	}
  
	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對(duì)象

使用生成的error對(duì)象和error map改寫(xiě)response和checkPhone方法

func response(w http.ResponseWriter, language int, err error) {
	e := account.SUCCESS
	var ok bool
	if 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.Code
	res["msg"] = e.Msg
	json, _ := json.Marshal(res)
	w.WriteHeader(200)
	w.Write(json)
}

func checkPhone(phoneNo string) error {
	if len(phoneNo) != 11 {
		return account.InValid_Phone
	}
	return nil
}

完整的代碼可以訪問(wèn)go-error-generator-examples項(xiàng)目進(jìn)行了解

我們來(lái)看下這是實(shí)現(xiàn)方式的優(yōu)點(diǎn)

  • 當(dāng)我們需要修改某個(gè)錯(cuò)誤描述時(shí)直接在account.proto文件中修改,無(wú)須修改代碼
  • 當(dāng)需要增加新的錯(cuò)誤時(shí)直接在account.proto文件中定義,生成代碼后直接在業(yè)務(wù)代碼中引用即可
  • 當(dāng)添加新的語(yǔ)言時(shí)只需要在error.proto中增加新的語(yǔ)言標(biāo)識(shí)即,然后在account.proto中引入即可

可以看出對(duì)于第一個(gè)和和第三個(gè)需求來(lái)說(shuō)只需要修改protobuf文件,重新生成代碼就可以,無(wú)須修改業(yè)務(wù)代碼。第二個(gè)需求也只是簡(jiǎn)單的引入新的錯(cuò)誤對(duì)象。

由于該插件是基于protobuf實(shí)現(xiàn)的,如果項(xiàng)目中沒(méi)有使用prorobuf技術(shù)棧的話會(huì)帶來(lái)一些引入成本。不過(guò)這點(diǎn)成本相對(duì)于頻繁修改業(yè)務(wù)代碼還是值得的。

相關(guān)鏈接

go-error-generator

go-error-generator-examples文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618977.html

到了這里,關(guān)于一個(gè)go的支持多語(yǔ)言的error自動(dòng)生成插件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔,支持多數(shù)據(jù)源批量生成(Word文檔)

    自動(dòng)生成數(shù)據(jù)庫(kù)設(shè)計(jì)文檔,支持多數(shù)據(jù)源批量生成(Word文檔)

    ? ? ? 在做項(xiàng)目時(shí)通常使用PowerDesigner設(shè)計(jì)數(shù)據(jù)庫(kù),但在項(xiàng)目完成交付項(xiàng)目給客戶的時(shí)候常常需要一份Word版本的數(shù)據(jù)庫(kù)文檔給客戶,你不能指望每個(gè)客戶都會(huì)用PowerDesigner,所以基于當(dāng)前開(kāi)發(fā)數(shù)據(jù)庫(kù)生成數(shù)據(jù)庫(kù)文檔就是最佳選擇,如果手動(dòng)編寫(xiě)數(shù)據(jù)庫(kù)文檔那將是一件非常痛苦的

    2024年04月23日
    瀏覽(30)
  • 一個(gè)開(kāi)源的全自動(dòng)視頻生成軟件MoneyPrinterTurbo

    一個(gè)開(kāi)源的全自動(dòng)視頻生成軟件MoneyPrinterTurbo

    只需提供一個(gè)視頻 主題 或 ,就可以全自動(dòng)生成視頻文案、視頻素材、視頻字幕、視頻背景音樂(lè),然后合成一個(gè)高清的短視頻。 一:功能特性 完整的 MVC架構(gòu),代碼 結(jié)構(gòu)清晰,易于維護(hù),支持 API 和 Web界面 支持視頻文案 AI自動(dòng)生成,也可以自定義文案 支持多種 高清

    2024年04月17日
    瀏覽(28)
  • AIGC:自動(dòng)化內(nèi)容生成,AI 的下一個(gè)引爆點(diǎn)?

    AIGC:自動(dòng)化內(nèi)容生成,AI 的下一個(gè)引爆點(diǎn)?

    來(lái)源|晨山資本 作者|吳文超 晨山資本副總裁,主要關(guān)注底層技術(shù)創(chuàng)新、人工智能和信息安全等領(lǐng)域。曾主導(dǎo)并參與了優(yōu)锘科技、達(dá)觀數(shù)據(jù)、雪浪數(shù)制、摩爾元數(shù)、LinkedMe、富數(shù)科技等多個(gè)企業(yè)的投資。在加入晨山資本之前,吳文超曾就職于明略科技集團(tuán),從事大數(shù)據(jù)研發(fā)工

    2024年02月09日
    瀏覽(26)
  • 又發(fā)現(xiàn)一個(gè)好玩的 Pycharm 插件,通過(guò)AI自動(dòng)生成代碼塊注釋

    又發(fā)現(xiàn)一個(gè)好玩的 Pycharm 插件,通過(guò)AI自動(dòng)生成代碼塊注釋

    經(jīng)常在開(kāi)發(fā)代碼塊的過(guò)程中都需要寫(xiě)大量的注釋來(lái)完成對(duì)代碼塊的說(shuō)明。作為一名程序猿可能經(jīng)常在抱怨別人開(kāi)發(fā)的代碼塊沒(méi)有注釋或是注釋不清楚,但我們自己又不想把大量的時(shí)間花費(fèi)在代碼塊注釋的編寫(xiě)上面。 今天要說(shuō)的這款插件是Mintlify Doc Writer,不僅支持Python,同時(shí)

    2024年02月11日
    瀏覽(55)
  • DataEase開(kāi)源BI工具安裝_數(shù)據(jù)全量_增量同步_大屏拖拽自動(dòng)生成_多數(shù)據(jù)源支持_數(shù)據(jù)血緣分析---大數(shù)據(jù)工作筆記0183

    DataEase開(kāi)源BI工具安裝_數(shù)據(jù)全量_增量同步_大屏拖拽自動(dòng)生成_多數(shù)據(jù)源支持_數(shù)據(jù)血緣分析---大數(shù)據(jù)工作筆記0183

    我這里用的是Centos7.9安裝的 可以通過(guò)uname -p來(lái)查看一下我們的電腦架構(gòu),可以看到是x86_64架構(gòu)的 ?我們下第一個(gè),這個(gè)是x86架構(gòu)的,第二個(gè)arm架構(gòu)的? ? 然后解壓到/opt/module中 ? 然后再去重命名一下文件夾.? 推薦200G? 本地模式的功能比較多 推薦100G ?

    2024年02月15日
    瀏覽(19)
  • 前端項(xiàng)目部署自動(dòng)檢測(cè)更新后通知用戶刷新頁(yè)面(前端實(shí)現(xiàn),技術(shù)框架vue、js、webpack)——方案一:編譯項(xiàng)目時(shí)動(dòng)態(tài)生成一個(gè)記錄版本號(hào)的文件

    前端項(xiàng)目部署自動(dòng)檢測(cè)更新后通知用戶刷新頁(yè)面(前端實(shí)現(xiàn),技術(shù)框架vue、js、webpack)——方案一:編譯項(xiàng)目時(shí)動(dòng)態(tài)生成一個(gè)記錄版本號(hào)的文件

    當(dāng)我們重新部署前端項(xiàng)目的時(shí)候,如果用戶一直停留在頁(yè)面上并未刷新使用,會(huì)存在功能使用差異性的問(wèn)題,因此,當(dāng)前端部署項(xiàng)目后,需要提醒用戶有去重新加載頁(yè)面。 vue、js、webpack 編譯項(xiàng)目時(shí)動(dòng)態(tài)生成一個(gè)記錄版本號(hào)的文件 輪詢(20s、自己設(shè)定時(shí)間)這個(gè)文件,判斷版

    2024年02月02日
    瀏覽(57)
  • 自動(dòng)生成測(cè)試用例_接口測(cè)試用例自動(dòng)生成工具

    自動(dòng)生成測(cè)試用例_接口測(cè)試用例自動(dòng)生成工具

    寫(xiě)用例之前,我們應(yīng)該熟悉API的詳細(xì)信息。建議使用抓包工具Charles或AnyProxy進(jìn)行抓包。 我們先來(lái)了解一下另一個(gè)項(xiàng)目har2case 他的工作原理就是將當(dāng)前主流的抓包工具和瀏覽器都支持將抓取得到的數(shù)據(jù)包導(dǎo)出為標(biāo)準(zhǔn)通用的 HAR 格式(HTTP Archive),然后 HttpRunner 將 HAR 格式的數(shù)據(jù)

    2024年02月05日
    瀏覽(26)
  • 抖音自動(dòng)生成視頻、字幕、自動(dòng)上傳發(fā)布

    抖音自動(dòng)生成視頻、字幕、自動(dòng)上傳發(fā)布

    點(diǎn)擊進(jìn)入https://github.com/Richard0403/dy-auto https://github.com/Richard0403/dy-auto/assets/14147304/21400a42-9296-4956-9517-ced8d8bf4737 名稱 功能 ffmpeg 處理視頻的生成,語(yǔ)音添加,字幕的添加等 微軟SpeechStudio 文字合成語(yǔ)音 whisper 語(yǔ)音生成字幕 jieba3k 用于文案的提取 playwright 用于自動(dòng)化操作 環(huán)

    2024年02月08日
    瀏覽(28)
  • python自動(dòng)生成SQL語(yǔ)句自動(dòng)化

    python自動(dòng)生成SQL語(yǔ)句自動(dòng)化

    前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。【點(diǎn)擊進(jìn)入巨牛的人工智能學(xué)習(xí)網(wǎng)站】。 在數(shù)據(jù)處理和管理中,SQL(Structured Query Language)是一種非常重要的語(yǔ)言。它用于在關(guān)系型數(shù)據(jù)庫(kù)中執(zhí)行各種操作,如查詢、插入、更新和刪

    2024年04月28日
    瀏覽(25)
  • 源生成器:根據(jù)需要自動(dòng)生成機(jī)械重復(fù)代碼

    本文概述了利用.NET Compiler Platform(“Roslyn”)SDK 附帶的 源生成器 (Source Generator)自動(dòng)生成機(jī)械重復(fù)的代碼。關(guān)于這部分的基礎(chǔ)入門(mén)知識(shí)可以在MSDN [1] 學(xué)到。 本文 默認(rèn) 已經(jīng)有一個(gè)解決方案,包含兩個(gè)項(xiàng)目。一個(gè)是普通C#項(xiàng)目,依賴于另一個(gè)源生成器項(xiàng)目。 此處以 Dependenc

    2024年02月01日
    瀏覽(95)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包