成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

分享一套Go編碼規(guī)范!歡迎收藏!

最近在項(xiàng)目中也 codereview 了不少 Go 語(yǔ)言的代碼,有必要總結(jié)下代碼規(guī)范,算是一個(gè)筆記記錄了。

說(shuō)在前面,這只是我們團(tuán)隊(duì)的一套規(guī)范而已。

今天我們聊一下 Go 的編碼規(guī)范,大概分為幾大模塊,如注包/變量/常量命名、基本語(yǔ)法、函數(shù)、錯(cuò)誤處理、心得等?!就扑]:golang教程】

1. 代碼風(fēng)格

1.1 代碼格式

  • 代碼必須用 gofmt 進(jìn)行格式化,goland 可以配置,可以自行搜索一下配置
  • 我們編寫(xiě)的代碼每行應(yīng)該不超過(guò) 120 個(gè)字符,超出部分用換行解決。
  • 單個(gè)文件最大行數(shù)最大不超過(guò) 800 行.
  • 單個(gè)函數(shù)最大行數(shù)不超過(guò) 80 行。
  • import 規(guī)范
    • 不要使用相對(duì)路徑引入包,例如 import ../util/net
    • 在導(dǎo)入包時(shí),多個(gè)相同包名沖突時(shí),必須使用導(dǎo)入別名

// bad "github.com/google/uuid"  // good uuid "github.com/google/uuid"
登錄后復(fù)制

  • 導(dǎo)入的包建議分組,引用匿名包建議用一個(gè)新的分組,并加上注釋方便后面小伙伴閱讀

import (     // Go 標(biāo)準(zhǔn)庫(kù)     "fmt"      //第三方包     "github.com/jinzhu/gorm"     "github.com/google/uuid"     "github.com/go-redis/redis/v8"      // 匿名包     /import mysql driver     _"github.com/jinzhu/gorm/dialects/mysql"      // 內(nèi)部包     slice "xxx.local/pkg/v1/goslice"     meta "xxx.local/pkg/v1/meta"     gomap "xxx.local/pkg/v2/gomap")
登錄后復(fù)制

1.2 聲明、初始化和定義

  • 一個(gè)函數(shù)需要使用多個(gè)變量時(shí),可以在函數(shù)最開(kāi)頭處使用 var 聲明。在函數(shù)外部聲明的變量不能使用 :=,會(huì)踩坑,不知道的可以評(píng)論區(qū)留言(要評(píng)論不易呀)!

var (     port = 8081     metricServerPort = 2001)
登錄后復(fù)制

  • 在初始化結(jié)構(gòu)體用 &struct 代替 new(struct),確保與結(jié)構(gòu)體初始化一致,初始化結(jié)構(gòu)體時(shí)換行。

// bad stu := new(S) stu.Name = "張三"  // good stu := &S{     Name:"李四" }
登錄后復(fù)制

  • 使用 make 在聲明 map、array 等應(yīng)該指定容器的容量,從而達(dá)到預(yù)先分配內(nèi)容。

users := make(map[int]string, 10)tags := make([]int, 0, 10)
登錄后復(fù)制

  • 使用標(biāo)準(zhǔn) var 關(guān)鍵字事,不要指定類(lèi)型,除非它與表達(dá)式的類(lèi)型不同。

// bad var _f string F()  func F() string {     return "hello world!" }  // good  var _f F()  func F() string {     return "hello world!" }
登錄后復(fù)制

1.3 error 處理

  • 若函數(shù)返回 error, 必須對(duì) error 進(jìn)行處理,如果業(yè)務(wù)允許可以用 _ 接受忽略。對(duì)應(yīng) defer 可以不用顯式進(jìn)行處理。

// bad func InitConfig() error {     ... } InitConfig()   // good func InitConfig() error {     ... } err := InitConfig() if err != nil {     ... } // or  _ := InitConfig()
登錄后復(fù)制

  • error 作為返回值時(shí)必須作為最后一個(gè)參數(shù)返回

// bad func InitConfig() (error,int) {     ... }  // good  func InitConfig() (int, error) {     ... }
登錄后復(fù)制

  • 錯(cuò)誤需要單獨(dú)處理,盡量不要與其他的邏輯耦合在一起。

// bad res, err := InitConfig() if err != nil || res != nil {     return err }  // good res, err := InitConfig() if err != nil {     return err } if res != nil {     return fmt.Errorf("invalid result") }
登錄后復(fù)制

1.4 panic處理

  • 業(yè)務(wù)代碼中禁止拋出 panic 錯(cuò)誤。
  • panic 只允許出現(xiàn)在在服務(wù)啟動(dòng)之前,如讀取配置、鏈接存儲(chǔ)(redis、mysql 等)。
  • 業(yè)務(wù)代碼中建議用 error 而不是 panic 來(lái)傳遞。

1.5 單元測(cè)試

  • 每個(gè)重要的函數(shù)都要編寫(xiě)測(cè)試用例,合并代碼要自動(dòng)化運(yùn)行一下所有的 test。
  • 文件命名 xxx_test.go。
  • 函數(shù)命名建議使用 Test函數(shù)名。

2. 命名規(guī)范

在每個(gè)語(yǔ)言中,命名規(guī)范在代碼規(guī)范中非常重要,一個(gè)統(tǒng)一的、精確的命名不僅僅可以提高代碼的可讀性,也可以讓人覺(jué)的這個(gè)同志真的會(huì)呀。牛!

2.1 包命名規(guī)范

  • 包名必須與目錄名一致(這和其他 php、Java 還是有一點(diǎn)不太一樣的),盡量采取有意義、簡(jiǎn)短的包名,不要與 go 的標(biāo)準(zhǔn)庫(kù)名稱(chēng)一樣。
  • 包名小寫(xiě),沒(méi)有下劃線(xiàn),可以使用中劃線(xiàn)隔開(kāi),使用多級(jí)目錄來(lái)劃分目錄。
  • 包名不要出現(xiàn)復(fù)數(shù)命名。
  • 包名命名盡量簡(jiǎn)單一目了然,ge:user、log。

2.2 文件命名規(guī)范

  • 文件名要見(jiàn)名思義,盡量簡(jiǎn)而短
  • 文件名小寫(xiě),組合詞用下劃線(xiàn)分割

2.3 函數(shù)命名規(guī)范

  • 與 php、Java 一樣,必須遵循駝峰規(guī)范,Go 語(yǔ)言中需要根據(jù)訪問(wèn)的控制決定大駝峰還是小駝峰。
  • 單元測(cè)試的函數(shù)用大駝峰,TestFunc。

2.4 結(jié)構(gòu)體命名規(guī)范

  • 與 php、Java 一樣,必須遵循駝峰規(guī)范,Go 語(yǔ)言中需要根據(jù)訪問(wèn)的控制決定大駝峰還是小駝峰。
  • 避免使用 info 、data 這種無(wú)意義的名稱(chēng)。
  • 命名使用名詞而非動(dòng)詞。
  • 結(jié)構(gòu)體在聲明和初始化的時(shí)候需要換行,eg:

type Student struct{     Name string     Age uint8}student := Student{     Name: "張三",     Age: 18,}
登錄后復(fù)制

登錄后復(fù)制

2.5 變量命名規(guī)范

  • 和 php、Java 一樣,必須遵循駝峰規(guī)范,Go 語(yǔ)言中需要根據(jù)訪問(wèn)的控制決定大駝峰還是小駝峰。
  • 若變量為私有時(shí),可以使用小寫(xiě)命名。
  • 局部變量可以簡(jiǎn)寫(xiě),eg:i 表示 index。
  • 若變量代表 bool 值,則可以使用 Is 、Can、Has 前綴命名,eg:

var isExit boolvar canReturn bool
登錄后復(fù)制

2.6 常量命名規(guī)范

  • 必須遵循駝峰規(guī)范,Go 語(yǔ)言中需要根據(jù)訪問(wèn)的控制決定大駝峰還是小駝峰。
  • 若代表枚舉值,需要先創(chuàng)建。

type Code intconst (     ErrNotFound Code = iota     ErrFatal)
登錄后復(fù)制

3. 類(lèi)型

3.1 字符串

好像學(xué)過(guò)的語(yǔ)言中,都是從字符串開(kāi)始說(shuō)起的。就像寫(xiě)代碼第一行都是從 Hello World!一樣!同意的點(diǎn)贊哈。

  • 字符串判空值

// bad if s == "" {     ...}  // good  if len(s) == 0 {     ...}
登錄后復(fù)制

  • 字符串去除前后子串。

// bad var s1 "hello world"var s2 "hello"var s3 strings.TrimPrefix(s1, s2) // good var s1 "hello world"var s2 "hello"var s3 stringif strings.HasPrefix(s1, s2){     s3 = s1[len(s2):]}
登錄后復(fù)制

3.2 切片 slice

  • 聲明 slice。

// bad s := []string{}s := make([]string, 10) // good var s []string s := make([]string, 0, 10)
登錄后復(fù)制

  • 非空判斷。

//bad if len(slice) >0 {     ...}  // good  if slice != nil && len(slice) > 0 {     ...}
登錄后復(fù)制

  • slice copy。

// badvar b1,b2 []bytefor i, v := range b1 {     b2[i] = v}for i := range b1 {     b2[i] = b1[i]}// goodcopy(b2,b1)
登錄后復(fù)制

  • slice 新增。

// bad var a,b []intfor _, v := range a {     b = append(b,v)} // good var a, b []int b := append(b, a...)
登錄后復(fù)制

3.4 結(jié)構(gòu)體 struct

  • 初始化需要多行。

type Student struct{     Name string     Age uint8}student := Student{     Name: "張三",     Age: 18,}
登錄后復(fù)制

登錄后復(fù)制

4. 控制語(yǔ)句

4.1 if

  • if 可以用局部變量的方式初始化。

if err := InitConfig; err != nil {     return err}
登錄后復(fù)制

4.2 for

  • 不允許在 for 中使用 defer, defer 只在函數(shù)結(jié)束時(shí)才會(huì)執(zhí)行。

// bad for file := range files {     fd, err := os.Open(file)     if err != nil {         return err    }     defer fd.close()} // good     for file := range files{     func() {         fd,err := os.open(file)         if err!=nil {             return err        }         defer fd.close()     }()}
登錄后復(fù)制

4.3 range

  • 如果不需要 key 直接用 _ 忽略,value 也一樣。

for _, v := range students {     ...}for i, _ := range students {     ...}for i, v := range students {     ...}
登錄后復(fù)制

注: 若操作指針時(shí)請(qǐng)注意不能直接用 s := v。想知道可以評(píng)論區(qū)告訴我哦!

4.4 switch

  • 和其他語(yǔ)言不一樣,必須要有 defalt

switch type {     case 1:         fmt.Println("type = 1")         break      case 2:         fmt.Println("type = 2")         break      default :         fmt.Println("unKnown type")}
登錄后復(fù)制

4.5 goto

  • 業(yè)務(wù)中不允許使用 goto。
  • 框架和公共工具也不允許使用 goto。

5. 函數(shù)

  • 傳參和返回的變量小寫(xiě)字母。
  • 傳入?yún)?shù)時(shí)slice、map、interface、chan 禁止傳遞指針類(lèi)型。
  • 采用值傳遞,不用指針傳值。
  • 入?yún)€(gè)數(shù)不能超出 5 個(gè),超過(guò)的可以用 struct 傳值。

5.1 函數(shù)參數(shù)

  • 返回值超出 1 個(gè)時(shí),需要用變量名返回。
  • 多個(gè)返回值可以用 struct 傳。

5.2 defer

  • 當(dāng)操作資源、或者事物需要提交回滾時(shí),可以在創(chuàng)建開(kāi)始下方就使用 defer 釋放資源。
  • 創(chuàng)建資源后判斷 error,非 error 情況后在用 defer 釋放。

5.3 代碼嵌套

  • 為了代碼可讀性,為了世界和平,盡量別用太多的嵌套,因?yàn)檎娴暮茈y有人類(lèi)能看懂。

6. 日常使用感悟

  • 能不用全局變量就不用,可以用參數(shù)傳值的方式,這樣可以大大降低耦合,更有利于單元測(cè)試。
  • 衣服開(kāi)發(fā)中,在函數(shù)間多用 context 傳遞上下文,在請(qǐng)求開(kāi)始時(shí)可以生成一個(gè) request_id,便于鏈路、日志追蹤。

6.1 提高性能

  • 在業(yè)務(wù)開(kāi)發(fā)中,盡量使用 strconv 來(lái)替代 fmt。
  • 我們?cè)谑褂?string 字符串類(lèi)型時(shí),當(dāng)修改的場(chǎng)景較多,盡量在使用時(shí)用 []byte 來(lái)替代。因?yàn)槊看螌?duì) string 的修改都需要重新在申請(qǐng)內(nèi)存。

6.2 避免踩坑

  • append 要小心自動(dòng)擴(kuò)容的情況,最好在申明時(shí)分配好容量,避免擴(kuò)容所帶來(lái)的性能上的損耗以及分配新的內(nèi)存地址。若不能確定容量,應(yīng)選擇一個(gè)比較大一點(diǎn)的值。
  • 并發(fā)場(chǎng)景下,map 非線(xiàn)程安全,需要加鎖。還有一種評(píng)論區(qū)告訴我吧。
  • interface 在編譯期間無(wú)法被檢查,使用上會(huì)出現(xiàn) panic,需要注意

7. 總結(jié)

本篇很講了 Go 語(yǔ)言的編碼規(guī)范,當(dāng)時(shí)想說(shuō)的,規(guī)范是大家預(yù)定的東西,每個(gè)公司、團(tuán)隊(duì)都會(huì)有不一樣的規(guī)范,只要大家一起遵循就好啦。你可以根據(jù)自己團(tuán)隊(duì)的需求,定一套屬于自己團(tuán)隊(duì)的項(xiàng)目規(guī)范。如果想小伙伴一起遵循,可以借助一些工具來(lái)保障執(zhí)行度。

講了很多,雖然很基礎(chǔ),希望對(duì)于剛剛轉(zhuǎn) Go 語(yǔ)言,或者剛學(xué)習(xí) Go 語(yǔ)言的同學(xué)有幫助吧。今天就到這里了。希望得到大家的一鍵三連。感謝!

本文系轉(zhuǎn)載,原文鏈接:mp.weixin.qq.com/s/lfjP9DEia2WL4Ua…

php入門(mén)到就業(yè)線(xiàn)上直播課:立即學(xué)習(xí)
全程直播 + 實(shí)戰(zhàn)授課 + 邊學(xué) + 邊練 + 邊輔導(dǎo)

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
国产精品青青在线麻豆| 麻豆国产96在线日韩麻豆| 免费无码AⅤ片在线观看| 入禽太深视频免费视频| 亚洲国产成人A精品不卡在线| 中文字幕被公侵犯的漂亮人妻 | 野花日本大全免费观看3中文版5 | 乱码午夜-极品国产内射| 少妇极度饥渴少妇高潮| 亚洲同性男GV网站SEARCH| 成年女人毛片免费观看中文| 狠狠色噜噜狠狠狠狠7777| 欧美另类VIDEOSBESTS| 西西人体444WWW高清大但| 44分钟欧美人与禽交片MP4| 国产精品无码专区在线观看| 蜜臀av午夜福利| 午夜理论片福利在线观看| 97精品伊人久久大香线蕉app| 国产精品亚洲第一区焦香味| 女人被男人吃奶到高潮| 亚洲AV毛片一区二区三区| FREEEⅩXX性欧美HD浪妇| 国色天香精品一卡2卡3卡| 欧洲码和亚洲码的尺码区别| 亚洲精品无码永久在线观看你懂的 | 久久精品人人看人人爽| 特级西西WWW444人体聚色| 中文字幕人妻无码乱精品| 国产精品日本亚洲欧美| 欧美男男作爱GAYWWW| 亚洲精品狼友在线播放| 丰满人妻被黑人连续中出| 浪荡女天天不停挨CAO日常视频 | 国内外精品激情刺激在线| 人人爽人人片人人片AV| 亚洲一区在线日韩在线尤物| 国产激情З∠视频一区二区| 欧美无遮挡很黄裸交视频| 亚洲欧美在线综合色影视| 夫妇联欢会回不去的夜晚| 妹妹中考前让我C了1次| 亚洲AV中文AⅤ无码AV不卡| 成人奭片免费观看| 免费精东传媒VS天美传媒| 亚洲AV无码成人精品区天堂| 豆国产97在线 | 韩国| 免费看黄A级毛片| 亚洲精品无码AV专区最新| 国产精品国产高清国产AV| 热99RE6久精品国产首页青柠| 野花韩国视频免费高清3 | 国产无套中出学生姝| 日韩精品无码人妻一区二区三区| 岳潮湿的大肥梅开二度第三部最新| 国产亚洲精品精华液好用吗| 色妞AV永久一区二区国产AV| 99RE热这里只有精品| 久久久久国色AV免费观看| 性色AV一区二区三区夜夜嗨| 粉嫩av.一区二区三区免费| 欧美精产国品一二三区别| 一二三四免费观看高清视频| 狠狠噜天天噜日日噜色综合| 无码免费无线观看在线视频| 成人免费一区二区三区视频 | 孽火(硬汉)今又| 野花 高清 中文 免费 日本| 国内精品久久久久精品电影| 天堂А√在线最新版中文下载| 把腿张开老子臊烂你| 嫩草院一区二区乱码| 影音先锋日日狠狠久久| 精品人妻一区二区三区四区在线 | 女人与公拘交酡ZOZO| 荫蒂每天被男人添| 久久精品成人无码观看免费| 亚洲AV综合伊人AV一区加勒比| 国产男女爽爽爽免费视频| 天堂VA在线高清一区| 粉嫩av一区二区网站入口| 日本熟妇厨房BBW| 办公室被公司领导C了很多次| 欧美激情一区二区三区成人| 337P日本欧洲亚洲大胆在线| 蜜桃视频一区二区| 中国97在线 | 免费| 乱中年女人伦AV三区| 已婚少妇美妙人妻系列| 久久中文字幕AV一区二区不卡 | 亚洲熟妇无码AV在线播放| 精品日产1区2卡三卡麻豆| 亚洲欧洲日产国码无码APP| 精品国产乱码久久久软件下载 | 国产精品偷窥熟女精品视频| 玩弄朋友娇妻呻吟交换电影| 国产SUV精品一区二区69| 特级毛片全部免费播放| 国产成人片无码视频在线观看| 少妇人妻AV无码专区| 国产99久久九九精品无码| 天堂А√在线最新版在线| 国产精品国色综合久久| 西西顶级艺术人像摄影| 国内精品久久人妻无码不卡| 亚洲AV永久无码精品无码电影| 激情综合色五月丁香六月亚洲| 亚洲乱码一区二区三区在线观看| 精品无人区麻豆乱码无限制| 亚洲中文AⅤ中文字幕| 麻花传媒剧国产MV在线观看| 18禁黄网站禁片免费观看APP| 欧美人与性口牲恔配视频o| 办公室熟妇人妻久久精品| 少妇饥渴偷公乱A级无码| 国产精品久久久久久久影院| 亚洲AV成人片无码色欲AV自慰| 好儿子妈妈今天就是你的女人 | 女的用嘴巴吃鸡会得HPV| www.丁香五月| 色婷婷AV一区二区三区浪潮慧瑟| 国产高清在线A视频大全| 亚洲AV成人无码一区在线观看 | 黑人玩弄人妻中文在线| 艳妇乳肉豪妇荡乳ⅩXXOO软件| 麻豆精产国品一二三区别| Chinese老妇性饥渴老熟女| 日日噜噜夜夜狠狠久久无码区| 国产精品国产高清国产AV| 亚洲AV永久综合在线观看尤物| 久久久久久亚洲精品无码| 99久久99久久精品国产片| 日韩夜夜高潮夜夜爽无码| 国产乱人伦偷精品视频免观看| 亚洲精品无码专区久久| 末成年女A∨片一区二区| 成人免费无码H黄网站WWW| 无码人妻精品一区二区蜜桃天美| 精品国产AⅤ无码一区二区蜜桃 | 综合激情五月综合激情五月激情1 综合激情丁香久久狠狠 | 欧美丰满熟妇人妻兽交视频| 东京热人妻丝袜AV无码| 亚洲AV本道一区二区三区四区| 久久水蜜桃亚洲AV无码精品| JZZIJZZIJ亚洲乱熟无码| 玩弄少妇秘书人妻系列| 极品无码AV国模在线观看| 2020久久国产综合精品SWA| 色综合久色AⅤ网| 精品国产AⅤ一区二区三区| 18禁强伦姧人妻又大又粗| 三级日本高清完整版热播| 国精品无码人妻一区二区三区| 伊在人亚洲香蕉精品区| 日系女生裸妆素颜| 精品国产污污免费网站入口| 99热热久久这里只有精品68| 偷拍与自偷拍亚洲精品| 久久久久久精品免费免费999| 啊灬啊灬啊灬快灬高潮了女| 性夜影院爽黄A爽在线看18禁| 久久精品国产99久久久古代| А√天堂资源地址在线官网BT| 西西人体444WWW大胆无码视频| 毛片无遮挡高清免费| 国产AV无码专区亚洲AV麻豆| 亚洲色丰满少妇高潮| 日本大片免A费观看视频| 护士被两个病人伦奷日出白浆| A4YY午夜福利视频无码| 亚洲AⅤ无码精品一区二区三区| 男女爽爽午夜18禁影院免费| 国产放荡对白视频在线观看| 又湿又紧又大又爽A视频| 四川少妇XXXX内谢欧美| 久久久久噜噜噜亚洲熟女综合| 大菠萝APP福引导前往| 亚洲一区二区无码偷拍| 入戏太深动漫未删减在线观看| 久久久久国色AV∨免费看| 丰满熟妇大肉唇张开| 一本加勒比波多野结衣| 天堂AV无码一区二区三区| 老公带朋友来家里C我怎么办| 国产超薄肉色丝袜视频| 中文字幕AV伊人AV无码AV| 无码人妻av一区二区三区毛片 | 男男H双腿涨灌PLAY慎入| 国产强奷在线播放| YY6080理AAA级伦大片| 亚洲精品成人A在线观看| 日韩人妻无码精品一专区| 久久青青草原精品国产| 国产精品乱子乱XXXX| AAAAA级少妇高潮大片| 亚洲国产欧美日韩精品一区二区三| 日韩人妻无码精品系列| 免费A级毛片无码A∨蜜芽按摩| 国产亚洲精品第一综合麻豆| 超级YIN荡的公司聚会|