說在前面,這只是我們團隊的一套規範而已。
今天我們聊一下 Go 的編碼規範,大概分為幾大模組,如注包/變數/常數命名、基本語法、函數、錯誤處理、心得等。【推薦:】
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")
登入後複製
var (
port = 8081
metricServerPort = 2001)
登入後複製
// bad
stu := new(S)
stu.Name = "張三"
// good
stu := &S{
Name:"李四"
}
登入後複製
users := make(map[int]string, 10)tags := make([]int, 0, 10)
登入後複製
// bad
var _f string F()
func F() string {
return "hello world!"
}
// good
var _f F()
func F() string {
return "hello world!"
}
登入後複製
// bad
func InitConfig() error {
...
}
InitConfig()
// good
func InitConfig() error {
...
}
err := InitConfig()
if err != nil {
...
}
// or
_ := InitConfig()
登入後複製
// 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")
}
登入後複製
在每個語言中,命名規範在程式碼規範中非常重要,一個統一的、精確的命名不僅僅可以提高程式碼的可讀性,也可以讓人覺的這個同志真的會呀。牛!
type Student struct{
Name string
Age uint8}student := Student{
Name: "張三",
Age: 18,}
登入後複製
登入後複製
var isExit boolvar canReturn bool
登入後複製
type Code intconst (
ErrNotFound Code = iota
ErrFatal)
登入後複製
好像學過的語言中,都是從字串開始說起的。就像寫程式碼第一行都是從 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):]}
登入後複製
// 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 {
...}
登入後複製
// badvar b1,b2 []bytefor i, v := range b1 {
b2[i] = v}for i := range b1 {
b2[i] = b1[i]}// goodcopy(b2,b1)
登入後複製
// bad
var a,b []intfor _, v := range a {
b = append(b,v)}
// good
var a, b []int
b := append(b, a...)
登入後複製
type Student struct{
Name string
Age uint8}student := Student{
Name: "張三",
Age: 18,}
登入後複製
登入後複製
if err := InitConfig; err != nil {
return err}
登入後複製
// 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()
}()}
登入後複製
for _, v := range students {
...}for i, _ := range students {
...}for i, v := range students {
...}
登入後複製
注: 若操作指標時請注意不能直接用 s := v。想知道可以評論區告訴我哦!
switch type {
case 1:
fmt.Println("type = 1")
break
case 2:
fmt.Println("type = 2")
break
default :
fmt.Println("unKnown type")}
登入後複製
本篇很講了 Go 語言的編碼規範,當時想說的,規範是大家預定的東西,每個公司、團隊都會有不一樣的規範,只要大家一起遵循就好啦。你可以根據自己團隊的需求,定一套屬於自己團隊的專案規範。如果想小夥伴一起遵循,可以藉助一些工具來保障執行度。
講了很多,雖然很基礎,希望對於剛剛轉 Go 語言,或者剛學習 Go 語言的同學有幫助吧。今天就到這裡了。希望得到大家的一鍵三連。感謝!
本文系轉載,原文連結:
php入門到就業線上直播課:
以上就是分享一套Go編碼規範!歡迎收藏!的詳細內容,更多請關注TW511.COM其它相關文章!