1. 程式人生 > >Go 實現 自動檢索 API 錯誤碼程式碼行 並 列印成文件,例 markDown 形式等

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 風格

使用步驟

  1. 配置好json檔案 DefaultConfig.json
{
  "TargetFileSuffix":[".go"],
  "TargetErrorFuncName":["util.GetCommonErr","util.GetErrWithTips"],
  "FilterFileName":["core"],
  "ParamsColumnNames":[" 錯 誤 碼 "," 含 義 ","提 示"],
  "ParamsSplitChar":","
}
  1. 輸入你的程式碼資料夾路徑並執行程式
func TestDocPrinter(t *testing.T) {
    p := NewDefaultErrorDocPrinter(NewDefaultMarkDownErrorDocPrinter())
    if p == nil {
        return
    }
    fmt.Println(p.printErrorDoc("../../errorDocPrinter"))
}
  1. 複製貼上結果
錯誤碼 含義 提示
-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