gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

分享一套Go編碼規范!歡迎收藏!

最近在項目中也 codereview 了不少 Go 語言的代碼,有必要總結下代碼規范,算是一個筆記記錄了。

說在前面,這只是我們團隊的一套規范而已。

今天我們聊一下 Go 的編碼規范,大概分為幾大模塊,如注包/變量/常量命名、基本語法、函數、錯誤處理、心得等。【推薦:golang教程】

1. 代碼風格

1.1 代碼格式

  • 代碼必須用 gofmt 進行格式化,goland 可以配置,可以自行搜索一下配置
  • 我們編寫的代碼每行應該不超過 120 個字符,超出部分用換行解決。
  • 單個文件最大行數最大不超過 800 行.
  • 單個函數最大行數不超過 80 行。
  • import 規范
    • 不要使用相對路徑引入包,例如 import ../util/net
    • 在導入包時,多個相同包名沖突時,必須使用導入別名

// bad "github.com/google/uuid"  // good uuid "github.com/google/uuid"
登錄后復制

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

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

1.2 聲明、初始化和定義

  • 一個函數需要使用多個變量時,可以在函數最開頭處使用 var 聲明。在函數外部聲明的變量不能使用 :=,會踩坑,不知道的可以評論區留言(要評論不易呀)!

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

  • 在初始化結構體用 &struct 代替 new(struct),確保與結構體初始化一致,初始化結構體時換行。

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

  • 使用 make 在聲明 map、array 等應該指定容器的容量,從而達到預先分配內容。

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

  • 使用標準 var 關鍵字事,不要指定類型,除非它與表達式的類型不同。

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

1.3 error 處理

  • 若函數返回 error, 必須對 error 進行處理,如果業務允許可以用 _ 接受忽略。對應 defer 可以不用顯式進行處理。

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

  • error 作為返回值時必須作為最后一個參數返回

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

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

// 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") }
登錄后復制

1.4 panic處理

  • 業務代碼中禁止拋出 panic 錯誤。
  • panic 只允許出現在在服務啟動之前,如讀取配置、鏈接存儲(redis、mysql 等)。
  • 業務代碼中建議用 error 而不是 panic 來傳遞。

1.5 單元測試

  • 每個重要的函數都要編寫測試用例,合并代碼要自動化運行一下所有的 test。
  • 文件命名 xxx_test.go。
  • 函數命名建議使用 Test函數名。

2. 命名規范

在每個語言中,命名規范在代碼規范中非常重要,一個統一的、精確的命名不僅僅可以提高代碼的可讀性,也可以讓人覺的這個同志真的會呀。牛!

2.1 包命名規范

  • 包名必須與目錄名一致(這和其他 php、Java 還是有一點不太一樣的),盡量采取有意義、簡短的包名,不要與 go 的標準庫名稱一樣。
  • 包名小寫,沒有下劃線,可以使用中劃線隔開,使用多級目錄來劃分目錄。
  • 包名不要出現復數命名。
  • 包名命名盡量簡單一目了然,ge:user、log。

2.2 文件命名規范

  • 文件名要見名思義,盡量簡而短
  • 文件名小寫,組合詞用下劃線分割

2.3 函數命名規范

  • 與 php、Java 一樣,必須遵循駝峰規范,Go 語言中需要根據訪問的控制決定大駝峰還是小駝峰。
  • 單元測試的函數用大駝峰,TestFunc。

2.4 結構體命名規范

  • 與 php、Java 一樣,必須遵循駝峰規范,Go 語言中需要根據訪問的控制決定大駝峰還是小駝峰。
  • 避免使用 info 、data 這種無意義的名稱。
  • 命名使用名詞而非動詞。
  • 結構體在聲明和初始化的時候需要換行,eg:

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

登錄后復制

2.5 變量命名規范

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

var isExit boolvar canReturn bool
登錄后復制

2.6 常量命名規范

  • 必須遵循駝峰規范,Go 語言中需要根據訪問的控制決定大駝峰還是小駝峰。
  • 若代表枚舉值,需要先創建。

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

3. 類型

3.1 字符串

好像學過的語言中,都是從字符串開始說起的。就像寫代碼第一行都是從 Hello World!一樣!同意的點贊哈。

  • 字符串判空值

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

  • 字符串去除前后子串。

// 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):]}
登錄后復制

3.2 切片 slice

  • 聲明 slice。

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

  • 非空判斷。

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

  • slice copy。

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

  • slice 新增。

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

3.4 結構體 struct

  • 初始化需要多行。

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

登錄后復制

4. 控制語句

4.1 if

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

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

4.2 for

  • 不允許在 for 中使用 defer, defer 只在函數結束時才會執行。

// 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()     }()}
登錄后復制

4.3 range

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

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

注: 若操作指針時請注意不能直接用 s := v。想知道可以評論區告訴我哦!

4.4 switch

  • 和其他語言不一樣,必須要有 defalt

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

4.5 goto

  • 業務中不允許使用 goto。
  • 框架和公共工具也不允許使用 goto。

5. 函數

  • 傳參和返回的變量小寫字母。
  • 傳入參數時slice、map、interface、chan 禁止傳遞指針類型。
  • 采用值傳遞,不用指針傳值。
  • 入參個數不能超出 5 個,超過的可以用 struct 傳值。

5.1 函數參數

  • 返回值超出 1 個時,需要用變量名返回。
  • 多個返回值可以用 struct 傳。

5.2 defer

  • 當操作資源、或者事物需要提交回滾時,可以在創建開始下方就使用 defer 釋放資源。
  • 創建資源后判斷 error,非 error 情況后在用 defer 釋放。

5.3 代碼嵌套

  • 為了代碼可讀性,為了世界和平,盡量別用太多的嵌套,因為真的很難有人類能看懂。

6. 日常使用感悟

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

6.1 提高性能

  • 在業務開發中,盡量使用 strconv 來替代 fmt。
  • 我們在使用 string 字符串類型時,當修改的場景較多,盡量在使用時用 []byte 來替代。因為每次對 string 的修改都需要重新在申請內存。

6.2 避免踩坑

  • append 要小心自動擴容的情況,最好在申明時分配好容量,避免擴容所帶來的性能上的損耗以及分配新的內存地址。若不能確定容量,應選擇一個比較大一點的值。
  • 并發場景下,map 非線程安全,需要加鎖。還有一種評論區告訴我吧。
  • interface 在編譯期間無法被檢查,使用上會出現 panic,需要注意

7. 總結

本篇很講了 Go 語言的編碼規范,當時想說的,規范是大家預定的東西,每個公司、團隊都會有不一樣的規范,只要大家一起遵循就好啦。你可以根據自己團隊的需求,定一套屬于自己團隊的項目規范。如果想小伙伴一起遵循,可以借助一些工具來保障執行度。

講了很多,雖然很基礎,希望對于剛剛轉 Go 語言,或者剛學習 Go 語言的同學有幫助吧。今天就到這里了。希望得到大家的一鍵三連。感謝!

本文系轉載,原文鏈接:mp.weixin.qq.com/s/lfjP9DEia2WL4Ua…

php入門到就業線上直播課:立即學習
全程直播 + 實戰授課 + 邊學 + 邊練 + 邊輔導

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
在线观看国产中文字幕| 午夜国产一区二区三区| 色诱视频在线观看| 国内外成人激情免费视频| 99精品人妻少妇一区二区| а 天堂 在线| 国产精彩免费视频| 日本国产中文字幕| 国产又黄又猛的视频| 乱人伦xxxx国语对白| 欧洲精品视频在线| 玖玖爱视频在线| 国产综合av在线| 日本一本中文字幕| 九九久久久久久| 国产一线二线三线在线观看| 国产日韩av网站| 青青草原播放器| 伊人成人222| 91激情视频在线| 日韩在线第三页| 国产91对白刺激露脸在线观看| av中文字幕av| 亚洲区成人777777精品| 色乱码一区二区三区熟女| 亚洲国产精品三区| 中文久久久久久| 成人免费在线观看视频网站| 日韩精品一区二区三区色欲av| 亚洲国产精品无码观看久久| 青青青在线观看视频| 黄色高清视频网站| 国产又大又长又粗又黄| 国产又粗又猛大又黄又爽| 欧美一级视频在线| 中文字幕一区二区在线观看视频 | 国产又粗又长又爽视频| 色噜噜狠狠一区二区三区狼国成人| 欧美激情精品久久久久久小说| 91av资源网| 中文字幕乱码人妻综合二区三区 | 亚洲在线观看网站| 一本色道久久88亚洲精品综合| 国产911在线观看| 三级黄色片免费观看| 免费看av软件| www.超碰97.com| 国产人妻777人伦精品hd| 九色91popny| 91日韩视频在线观看| 久久av高潮av| 国产网站免费在线观看| 成人av在线播放观看| 九九九九九九九九| 国产无遮挡猛进猛出免费软件| 97国产在线播放| 日韩a级在线观看| 9191国产视频| 一本色道久久88亚洲精品综合| 国产中文字幕免费观看| www.国产在线播放| 午夜dv内射一区二区| 欧美 日韩 亚洲 一区| 国产亚洲视频一区| 色一情一区二区三区| 国产又大又黄又粗又爽| 日韩av手机版| 伊人国产在线视频| 伊人免费视频二| 蜜桃视频成人在线观看| 天堂av在线中文| 蜜臀av性久久久久蜜臀av| 四虎永久免费网站| 妺妺窝人体色www看人体| 99国产精品白浆在线观看免费| 激情五月六月婷婷| 国产二区视频在线播放| 欧美s码亚洲码精品m码| 欧洲熟妇精品视频| 国产传媒免费观看| 成人在线免费观看视频网站| 欧美亚洲色图视频| 欧美日韩大尺度| 亚洲午夜激情影院| 免费日韩在线观看| 少妇高潮喷水在线观看| 日本网站免费在线观看| 中文字幕第100页| caoporm在线视频| 日韩高清在线一区二区| 激情视频小说图片| 日本久久久精品视频| 91极品视频在线观看| 公共露出暴露狂另类av| 18岁网站在线观看| 美女少妇一区二区| 大片在线观看网站免费收看| 欧美v在线观看| 国产精品igao网网址不卡| 玩弄中年熟妇正在播放| 中文字幕 91| 人人妻人人添人人爽欧美一区| 亚洲高清在线免费观看| 亚洲高清免费在线观看| 777av视频| 黄色a级三级三级三级| 青青草视频在线免费播放| 久久黄色片网站| 欧美色图另类小说| 少妇高清精品毛片在线视频| 999久久久精品视频| 欧美日韩一道本| 中文字幕超清在线免费观看| av免费网站观看| 丁香婷婷综合激情| 黄色一级二级三级| 国产人妻777人伦精品hd| 国产一级片中文字幕| 欧美精品性生活| 国产资源在线视频| 免费特级黄色片| 艳母动漫在线观看| 中文字幕丰满乱码| 国产成人综合一区| 六月丁香婷婷激情| 青草视频在线观看视频| 99re6这里有精品热视频| 欧洲在线免费视频| 性生生活大片免费看视频| 成人黄色片视频| 能在线观看的av| 日韩av综合在线观看| 青青青在线视频播放| 国产夫妻自拍一区| 性一交一乱一伧国产女士spa| 影音先锋成人资源网站| 裸体大乳女做爰69| 成人手机在线播放| 欧美中文字幕在线观看视频 | 日韩视频免费播放| 精品人妻人人做人人爽| 中文字幕人妻熟女人妻洋洋| 久久综合亚洲精品| 日韩精品视频在线观看视频| www.国产在线视频| 日本在线xxx| 中文字幕无码不卡免费视频| 99久久激情视频| 少妇一级淫免费播放 | 成年人黄色在线观看| 在线视频一二三区| 国产va亚洲va在线va| 免费无码不卡视频在线观看| 国产中文字幕在线免费观看| 热久久精品国产| 最近中文字幕一区二区| 中文字幕色网站| 日韩精品一区二区免费| 日日摸日日碰夜夜爽av| 婷婷丁香激情网| 一女二男3p波多野结衣| 精品一区二区成人免费视频 | 中文字幕免费高清在线| 日本高清免费在线视频| 毛片av在线播放| 国产精品久久久久9999小说| 欧美大片久久久| 丝袜人妻一区二区三区| 欧美三级午夜理伦三级富婆| 香蕉视频免费版| 成人在线看视频| 在线成人免费av| 69堂免费视频| 做a视频在线观看| 色欲色香天天天综合网www| 在线视频日韩一区| 日本男女交配视频| 无码内射中文字幕岛国片| 日本三日本三级少妇三级66| 噜噜噜久久亚洲精品国产品麻豆| 中文字幕亚洲乱码| 人人干视频在线| 亚洲美女性囗交| aa视频在线播放| 三级黄色片免费观看| 日日橹狠狠爱欧美超碰| 国产又粗又猛大又黄又爽| 成年人观看网站| 日本a在线天堂| 三级一区二区三区| 浮妇高潮喷白浆视频| 国产日韩欧美大片| 182午夜在线观看| 可以免费观看av毛片| 欧美 日韩 国产精品| 香蕉视频色在线观看| 国产又大又黄又猛| 成人三级视频在线播放| 成人免费观看在线| 黄色片免费在线观看视频|