最近在项目中也 codereview 了不少 Go 语言的代码,有必要总结下代码规范,算是一个笔记记录了。
说在前面,这只是我们团队的一套规范而已。
今天我们聊一下 Go 的编码规范,大概分为几大模块,如注包/变量/常量命名、基本语法、函数、错误处理、心得等。【推荐:golang教程】
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 语言的同学有帮助吧。今天就到这里了。希望得到大家的一键三连。感谢!
本文系转载,原文链接:mp.weixin.qq.com/s/lfjP9DEia2WL4Ua...
以上是分享一套Go编码规范!欢迎收藏!的详细内容。更多信息请关注PHP中文网其他相关文章!