Go 實現 自動檢索 API 錯誤碼程式碼行 並 列印成文件,例 markDown 形式等
作者:林冠巨集 / 指尖下的幽靈
如果你是一個後端Server程式
開發人員。你應該知道,在你寫完API
之後,是需要給客戶端
的同學提供呼叫
文件的。
例如下面一個api handler
,建立一個使用者
。
func HandleCreateUser(w http.ResponseWriter,r *http.Request) map[string]interface{} { if r.Body == nil { return util.GetCommonErr(23,"create user req body is fucking null?") } .... .... return util.GetCommonSuccess("success") }
上面有一行錯誤資訊輸出的程式碼
util.GetCommonErr(23,"create user req body is fucking null?")
假設我們要寫成markDown風格的
文件,上面的可能是這樣一種對應
錯誤碼 | 含義 | 提示 |
---|---|---|
23 | create user req body is fucking null? | 暫無 |
Ok,這只是一個錯誤資訊的情況,我們很輕鬆就手動
寫完了。
如果有幾百上千個
呢?一個完整的服務端程式,肯定會有很多這種錯誤資訊輸出
的程式碼。在幾百上千個
的時候,還要手動寫?這是多麼低效率
,且浪費時間
的令人窒息
的操作。
而我這篇文章要介紹的就是一個幫你自動檢索並生成API輸出錯誤資訊文件
的開源程式
ErrorDocAutoPrinter
它,具備下面的特點
- 自定義程式碼資料夾路徑
Json
配置檔案形式匯入設定,避免反覆編譯程式- 按照給定的
程式碼方法名稱
自動檢索對應的程式碼行 - 按照給定的
切割引數規則
,自動切割組合 - 按照給定的
列名描述
,自動組合成新的文字 - 介面化的設計邏輯,高度自定義
- 自動按照
code
從小到大排序輸出,可控! - 自動提示
重複出現過
的錯誤資訊。 - 自動按照設定生成輸出檔案
- 可設定
符合目標
的檔案字尾
- 可設定
需要過濾
的檔名,符合就不處理 - 自定義輸出風格,
markDown
?txt
?html
? - 自行定義輸出的邏輯,可以對映到很多情況的文字玩法
- 總之:‘為所欲為’
我,提供了兩種風格的輸出
簡單文字
風格markDown
風格
使用步驟
- 配置好
json
檔案DefaultConfig.json
{
"TargetFileSuffix":[".go"],
"TargetErrorFuncName":["util.GetCommonErr","util.GetErrWithTips"],
"FilterFileName":["core"],
"ParamsColumnNames":[" 錯 誤 碼 "," 含 義 ","提 示"],
"ParamsSplitChar":","
}
- 輸入你的
程式碼資料夾路徑
並執行程式
func TestDocPrinter(t *testing.T) {
p := NewDefaultErrorDocPrinter(NewDefaultMarkDownErrorDocPrinter())
if p == nil {
return
}
fmt.Println(p.printErrorDoc("../../errorDocPrinter"))
}
- 複製貼上
結果
錯誤碼 | 含義 | 提示 |
---|---|---|
-9 | invalid create user | --空缺-- |
-4 | invalid create user | --空缺-- |
-1 | create user failed | 建立使用者失敗 |
88 | 建立評論失敗 | --空缺-- |
3110 | error params | --空缺-- |
3111 | update failed | --空缺-- |
3112 | yellow 內容涉黃 | --空缺-- |
3113 | forbid 禁止訪問 | --空缺-- |
3114 | empty id | --空缺-- |
3115 | 服務端開啟事務失敗 | --空缺-- |
3116 | 服務端事務提交失敗 | --空缺-- |
3117 | update effect row <= 0 | --空缺-- |
3118 | RowsAffected 失敗 | --空缺-- |
3119 | 更新只有部分成功 | --空缺-- |
3120 | empty userId | --空缺-- |
3121 | too lager | --空缺-- |
3122 | user not exits | --空缺-- |
3123 | 非法更新 | --空缺-- |
3124 | 引數個數長度限制 | --空缺-- |
3126 | 服務端事務提交失敗 | --空缺-- |
3127 | invalid money | --空缺-- |
3128 | money not enough | --空缺-- |
3129 | 建立消費記錄失敗 | --空缺-- |
基本說完了,原始碼見上面的開源連結,去玩吧。
簡單分析下 markDown
風格的生成
介面
type IErrorDocPrinter interface {
FindLines(printer *ErrorDocPrinter,reader *bufio.Reader,fileName,currentSuffix string,handleLine func(line string)) []string
BuildACell(printer ErrorDocPrinter,columns,size int,prefixName,param string) string
ResultLine(line string)
EndOfAFile(printer ErrorDocPrinter,aFileRetLines []string)
EndOfAllFile(printer ErrorDocPrinter,allRetLines []string)
}
找到一個檔案所有行
func (p MarkDownErrorDocPrinter) FindLines(
printer *ErrorDocPrinter,reader *bufio.Reader,fileName,currentSuffix string,handleLine func(line string)) []string {
// 正則匹配 todo
var lines []string
printer.currentLineNum = 0
for {
byt, _, err := reader.ReadLine()
if err != nil {
// 讀完一個檔案
break
}
line := string(byt)
// 排除註釋
printer.currentLineNum++
if startWith(line,"//") {
continue
}
if startWith(line,"/*") {
continue
}
if startWith(line,"*") {
continue
}
for _,value := range printer.TargetErrorFuncName {
if strings.Contains(line,value) {
// hit,準備生成
handleLine(line)
lines = append(lines,line)
}
}
}
return lines
}
處理一個單元格
func (p MarkDownErrorDocPrinter) BuildACell(
printer ErrorDocPrinter,columns,size int,prefixName,param string) string {
/**
| Name | Academy | score |
| - | - | - |
| Harry Potter | Gryffindor| 90 |
| Hermione Granger | Gryffindor | 100 |
| Draco Malfoy | Slytherin | 90 |
*/
if columns == 0 {
code,err := strconv.ParseInt(param,10,64)
if err == nil {
codeArr = append(codeArr,code)
}
return "|" + param
}
count := tipsMap[param]
if columns == 1 {
// 儲存提示列
if count != 0 {
count++
diffMap[fmt.Sprintf("param: -- %s -- times:%d",param,count-1)] =
fmt.Sprintf(" 與 %s 的第 %d 行提示重複",printer.currentFileName,printer.currentLineNum)
}else{
count = 1
}
tipsMap[param] = count
}
if columns == size - 1 {
return "|" + param + "|"
}
// 找出提示一樣,但是 code 不一樣的
return "|" + param
}
從小到大排序--code
func quickSort(arr *[]int64,left,right int) {
if arr == nil {
return
}
if right == len(*arr) {
right--
}
if left < 0 || left >= len(*arr) {
return
}
hight := right
low := left
base := (*arr)[left]
if low < hight {
for ;low < hight; {
for ;low < hight && base <= (*arr)[hight]; {
hight--
break
}
(*arr)[low] = (*arr)[hight]
for ;low < hight && base >= (*arr)[low]; {
low++
break
}
(*arr)[hight] = (*arr)[low]
}
(*arr)[low] = base
quickSort(arr,left,low-1)
quickSort(arr,low+1,right)
}
}
組裝
quickSort(&codeArr,0,len(codeArr))
codeArrSize := len(codeArr)
for i:=0; i<codeArrSize ;i++ {
codeAtr := strconv.Itoa((int)(codeArr[i]))
index := 0
for _,line := range allRetLines {
if strings.Contains(line,"|"+codeAtr+"|") {
final = append(final,line)
// 減去一個,減少迴圈次數
//retLines = append(retLines[:index],retLines[index+1:]...)
index--
break
}
index++
}
}
// 生成檔案
fileName := "errorInfo.md"
file,err := os.Create(fileName)
defer file.Close()
if err!=nil {
fmt.Println(err)
}
for _,line := range final {
fmt.Println(line)
file.WriteString(line+"\n")
}
如果程式設計不是為了讓複雜的問題簡單化,那和機械學習有什麼區別?
相關推薦
Go 實現 自動檢索 API 錯誤碼程式碼行 並 列印成文件,例 markDown 形式等
作者:林冠巨集 / 指尖下的幽靈 如果你是一個後端Server程式開發人員。你應該知道,在你寫完API之後,是需要給客戶端的同學提供呼叫文件的。 例如下面一個api handler,建立一個使用者。 func HandleCreateUser(w http.ResponseWriter,r *
Java反射+註解實現自動持久化小例子(程式碼未優化)
需要實現的功能:根據實體類自動生成Sql語句與引數。 基本思路是:在實體類上標識註解,使用反射讀取註解然後拼接Sql語句。 哦了,開始研究程式碼~ 有請主人公註解:
java+maven工程 實現 自動對war包進行復制並修改和替換每個的配置檔案
在工作中碰到一個比較苦惱的事情,(這裡以7條線為例子)同一個war包 需要部署7條生產線,但是每個生產線的編號以及ip都不同,導致我們手動的每個包去替換配置檔案和配 置ip的js檔案 &n
java+maven工程 實現 自動對war包進行復制並修改和替換每個的配置文件
classes cep res 發生 分離 sys span 一個 pla 在工作中碰到一個比較苦惱的事情,(這裏以7條線為例子)同一個war包 需要部署7條生產線,但是每個生產線的編號以及ip都不同,導致我們手動的每個包去替換配置文件和配 置ip
Spring Boot如何讓Web API自動生成文件,並解決swagger-annotations的API註解description屬性廢棄的問題
前後端分離的系統架構中,前端開發人員需要檢視後端WEB API的文件來進行開發。採用後端API文件自動生成的方式,可以大幅提高開發效率。swagger是一個被廣泛使用的文件自動生成工具,可以與多種程式語言結合使用。我們可以利用合適的jar包,讓swqgger來協
No.18 程式碼練習:列印乘法口訣,交換變數值,判斷閏年,陣列操作
學習不易,需要堅持。 1.實現一個函式,列印乘法口訣表,口訣表的行數和列數自己指定, 輸入5,輸出55口訣表,輸入,輸出99的乘法口訣表。 2.使用函式實現兩個數的交換。 3.實現一個函式判斷year是不是潤年。 4.建立一個數組,實現函式init()初始化陣列、實現empt
寫程式碼:迴圈列印names列表,把元素和索引值都打印出來。
list1 = ['aaa', 'bbb', 'ccc', 'ddd', 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 9, 19] # count = 0 # for i in list1: # print(count, i) # count += 1 for
doxygen使用~~用這個註釋自動生成文件,炒雞方便
doxygen 使用 + C/C++註釋規範 1、安裝 yum -y install doxygen #基本安裝 yum -y install doxygen-doxywizard #圖形介面安裝 2、生成配置檔案 doxygen -g [配置檔名] #預設檔名為D
重溫 Win32 API ----- 截圖指定視窗並列印
朋友說在一個VC++6.0開發的專案中要加入列印視窗的功能,讓幫忙寫個程式碼供其呼叫。這麼老的IDE當然不想碰了,而且也不喜歡MFC笨拙不清晰的封裝,所以決定採用純Win32 API,然後用C++類簡單封裝一下。1 基本思路視窗DC和印表機DC是兩類不相容的DC,所以它們之間
豆瓣restful api 狀態和錯誤碼
targe 文檔 錯誤 creat word mis for bmp args 豆瓣 API 通過HTTP Status Code來說明 API 請求是否成功 下面的表格中展示了可能的HTTP Status Code以及其含義 狀態碼 含義 說明 200 OK 請
用Jenkins集成ios項目設置多scheme,同一代碼自動輸出多個環境包 實現便捷切換API環境
ios項目 bug 編譯打包 不同配置 online space 測試 jenkin spa Jenkins 安裝使用參考我的博客http://www.cnblogs.com/zhujin/p/9064820.html Xcode 配置:說明 一個schema 對應一套環境
1024程式設計師節-程式碼實現自動下載英語聽力音訊檔案
背景 小馬英語,《每天10分鐘英語聽力-基礎篇》,由於音訊檔案是通過掃碼獲取播放音訊檔案的連結頁面,這樣極為不方便,所以想直接把所有音訊檔案下載好放在QQ音樂裡面,然後像播放歌曲一樣來聽聽力訓練。然而,音訊連結頁面並不提供下載的連結,新東方的音訊檔案是這樣的,有下載按
Lucene全文檢索之倒排索引實現原理、API解析【2018.11】
》 官網 http://lucene.apache.org/ 下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/7.5.0/ 》 Lucene的全文檢索是指什麼: 程式掃描文件
使用Karate輕鬆實現自動API測試
如果您想做自動API測試,但沒有程式設計背景,那麼你必須要給Karate一個機會! Karate由Intuit作為開源工具釋出。該工具旨在用於自動API測試,並具有使API測試變得輕而易舉且實際上令人愉快的所有必需功能。 與需要大量編碼的其他自動化API測試工具不同,即使只是做基
python3使用百度翻譯API實現自動翻譯
百度翻譯開放平臺 註冊登入,建立個人服務 檢視技術文件 介面引數配置 例項應用 翻譯一個單詞 翻譯一句話 翻譯一段話 註冊登入,建立個人服務 在此不詳
手摸手帶你部署git伺服器實現自動釋出程式碼
前段趁著活動買了個騰訊雲伺服器,一直沒抽時間去折騰,最近才開始部署了一個自己專屬的git倉庫,實現程式碼自動釋出部署功能。(我也想成為努力向上,積極進取的有志青年啊!)文章的內容基本都是參考自谷歌搜尋,然後按我的思路重新整理一遍,既是為了分享也是為了鞏固知識。 我也是第一次折騰伺服器,前期部署就
[Go]基於GoProxy實現HTTP代理,攔截智慧樹注入JS實現自動刷課
這幾天各種網課都快截至了,鄙人也是被逼得煩的不行 雖然網上有刷課的瀏覽器,但是每次換個地方就得重新拷貝一邊 所以就想能不能寫一個HTTP代理,丟在伺服器上,自己不管到哪裡,設定上代理就能刷課 從本質來說其實都是注入JS,跟瀏覽器相比換個注入方式而已 既然要寫HTTP代理,第一時間就想到了大名鼎鼎的Go
Linux+git+springboot+maven 實現自動更新程式碼(自動部署)
思路:首先是在linux伺服器上建立一個git倉庫,然後克隆程式碼到倉庫,寫一個指令碼先拉取程式碼,在構建最後部署 1. 建立git倉庫 建立一個資料夾執行 git init 命令,初始化倉庫 2. 克隆程式碼
小程式不能呼叫豆瓣API介面(403錯誤碼)
1、按照網上較為流行的豆瓣API呼叫方法一般如下 onLoad: function(options) { wx.request({ url:"https://api.douban.
Go語言實現以太坊交易傳送程式碼
轉載請註明。 talk is cheap show you the code import ( "math/big" "testing" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/g