最近在项目中也 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中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号