1.命名规则

名字很重要

起名要有可读性, 好变量名的特点是

  • 一致 (容易猜测)
  • 简短 (易于输出)
  • 准备 (易于理解)

通常来说,如果一个名字的作用域比较大,生命周期也比较长,那么用长的名字将会更有意义。但是局部变量还是参考以上三点

1. 项目目录名

使用中划线组合

1
2
# BAD
blog_server
1
2
# GOOD
blog-server

2. 包名

图片描述

  • 使用 bytes.Buffer and strings.Reader,而没有 bytes.ByteBuffer and strings.StringReader
  • 导出的软件包名要有意义, 避免 util ,common 等
  • 避免使用大写字母, 且不要有重复的单词
1
2
3
4
5
6
7
# BAD
import (
	"MyUtils"           
	"blog_server"
	"blog-server"
	"blog server"
)
1
2
3
4
5
# GOOD
import (
	"cmd5"
	"blog"
)

3. 文件或文件夹名

文件或文件夹名建议使用 蛇形命名,一些系统并不会对文件名区分大小写

1
2
# BAD
buildTest.go
1
2
# GOOD
build_test.go

避免和保留特定用法的后缀冲突

1
2
# 测试文件
_test.go
1
2
3
# 系统相关
_386.go、_amd64.go、_arm.go、_arm64.go、_android.go、_darwin.go、_dragonfly.go、_freebsd.go、_linux.go、_nacl.go、_netbsd.go、_openbsd.go、_plan9.go、_solaris.go、_windows.go、_android_386.go、_android_amd64.go、_android_arm.go、_android_arm64.go、_darwin_386.go、_darwin_amd64.go、_darwin_arm.go、_darwin_arm64.go、_dragonfly_amd64.go、_freebsd_386.go、_freebsd_amd64.go、_freebsd_arm.go、_linux_386.go、_linux_amd64.go、_linux_arm.go、_linux_arm64.go、_linux_mips64.go、_linux_mips64le.go、_linux_ppc64.go、_linux_ppc64le.go、_linux_s390x.go、_nacl_386.go、_nacl_amd64p32.go、_nacl_arm.go、_netbsd_386.go、_netbsd_amd64.go、_netbsd_arm.go、_openbsd_386.go、_openbsd_amd64.go、_openbsd_arm.go、_plan9_386.go、_plan9_amd64.go、_plan9_arm.go、_solaris_amd64.go、_windows_386.go
_windows_amd64.go

4. 常量

  • 使用大小写混排的驼峰命名,不允许出现下划线
  • 字母缩略词应全大写 , 像ASCII和HTML这样的缩略词则避免使用大小写混合的写法,它们可能被称为htmlEscape、HTMLEscape或escapeHTML,但不会是escapeHtml。
1
2
3
# BAD
BLOG_SERVER
escapeHtml
1
2
3
# GOOD
BlogServer
escapeHTML

按照功能来区分,而非所有类型都分在一组,公共常量置于私有常量之前

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# BAD

const (
	# 错误 : 私有常量应写公有常量后面
	blog = "BLOG"
	Page=1   				# 用于分页
	Limit=10
	Page404 = "404" # 标记
	...
)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# GOOD
const (
  # 分页
	Page = 1
	Limit = 10
	
	# 标记
	Page404 = "404"
	
	# 私有常量
	blog = "BLOG"
)

5. 变量

使用大小写混排的驼峰命名,不允许出现下划线

局部变量简短

  • 用 i 比 index 更合适
  • 用 r 比 reader 更合适
  • 若为 bool 类型, 应以 has,is ,can,allow 开头

考虑上下文, 避免使用冗余名称

Good code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func RuneCount(b []byte) int {
    count := 0
    for i := 0; i < len(b); {
        if b[i] < RuneSelf {
            i++
        } else {
            _, n := DecodeRune(b[i:])
            i += n
        }
        count++
    }
    return count
}

全局变量

变量长度应与作用域相关,作用域越小,则使用简短的单字母

作用域越大,可定义完整单词或有意义的句子

6. 结构体

建议采用名词

7. 接口

仅指定一种方法的接口通常在函数名后附加 er,尽管可能不是正确的英语

1
2
3
4
5
6
7
8
type Reader interface {
    Read(p []byte) (n int, err error)
}


type Execer interface {
    Exec(query string, args []Value) (Result, error)
}

8. 函数

函数名力求精简准确,并采用动词

函数参数

类型是描述性的, 应该简短

1
2
func AfterFunc(d Duration, f func()) *Timer
func Escape(w io.Writer, s []byte)

函数名明确,类型不明确,参数名称可使用单词缩略

1
func Unix(secnsec int64) time

参考

Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy