博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go-技篇第二 命名规范
阅读量:5135 次
发布时间:2019-06-13

本文共 2074 字,大约阅读时间需要 6 分钟。

优秀的命名

优秀的命名应当是一贯的、短小的、精确的。

所谓一贯,就是说同一个意义在不同的环境下的命名应当一致,譬如依赖关系,不要在一个方法中命名为depend,另一个方法中命名为rely。
所谓短小,不必多言,当命名过长的时候,读者可能更关注命名本身,而忽视真正的逻辑内容。
所谓精确,就是命名达意、易于理解

首条经验

声明位置与使用位置越远,则命名应当越长。

骆驼命名法

Go语言应该使用 MixedCase

(不要使用 names_with_underscores)
首字母缩写词都应该用大写,譬如ServeHTTPsceneIDCIDRProcessor

局部变量

局部变量应当尽可能短小,譬如使用buf指代buffer,使用i指代index

在很长的函数中可能会有很多的变量,这个时候可以适当使用一些长名字。
但是写出这么长的函数,通常意味着代码需要重构了!??‍

参数

函数的参数和局部变量类似,但是它们默认还具有文档的功能

当参数类型具有描述性的时候,参数名就应该尽可能短小:

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

当参数类型比较模糊的时候,参数名就应当具有文档的功能:

返回值

在Go语言中,返回值可以定义名称的,它可以当做一种特殊的参数。

尤其重要的是,在外部可见的函数中,返回值的名称应当可以作为文档参考。

方法接收者(Receiver)

方法接收者也是一种特殊的参数。Go语言中没有明显的面向对象的概念,可以对方法定义方法接收者来实现类似于对象的方法的概念。

按照惯例,由于方法接收者在函数内部经常出现,因此它经常采用一两个字母来标识方法接收者的类型。

 
func (b *Buffer) Read(p []byte) (n int, err error)
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request)
func (r Rectangle) Size() Point

需要注意的是,方法接收者的名字在同一类型的不同方法中应该保持统一,这也是前文所述的一贯性的需求。

导出包级别命名

导出名被使用的时候通常是放在包名后

所以,在导出变量、常数、函数和类型的时候,
不要把包名的意义再写一遍

比较好的名字

bytes.Buffer strings.Reader

比较蠢的名字

bytes.ByteBuffer strings.StringReader

接口类型

只含有一个方法的接口类型通常以函数名加上er后缀作为名字

 
type Reader
interface {
Read(p []
byte) (n
int, err error)
}

有时候可能导致蹩脚的英文,但别管他,能看懂就好

 
type Execer
interface {
Exec(p []
byte) (n
int, err error)
}

有时候可以适当调整一下英文单词的顺序,增加可读性:

 
type ByteReader
interface {
ReadByte(p []
byte) (n
int, err error)
}

当接口含有多个方法的时候,还是要选取一个能够精准描述接口目的的名字,譬如net.Connhttp/ResponseWriter

Error的命名

Error类型应该写成FooError的形式

 
type ExitError
struct {
....
}

Error变量协程ErrFoo的形式

包的命名

应当与它导出代码的内容相关,避免utilcommon这种宽泛的命名

引入路径

包路径的最后一个单词应该和包名一致

包路径应该尽可能简洁

记得把库的主要代码直接放在代码库的根目录

避免在包路径中使用任何大写字母(并非所有文件系统都区分大小写)

标准库

上述很多例子都是从标准库中来的

标准库的很多内容都可以作为参考

多看看标准库来寻求灵感吧

但是要记住:

当作者写标准库的时候,他们自己也在学习过程中。

多数情况下作者是对的,但是偶尔还是会犯一些错误

 
var ErrFormat = errors.New("unknown format")
 
func Copy(dst Writer, src Reader) (written int64, err error)
func ScanBytes(data []byte, atEOF bool) (advance int, token []byte,
err error)
 
func Unix(sec, nsec int64) Time
func HasPrefix(s, prefix []byte) bool

转载于:https://www.cnblogs.com/zhangboyu/p/01fb1e0fc19c02e3f6460ebbb6dd61c8.html

你可能感兴趣的文章
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
下一代操作系统与软件
查看>>
Python IO模型
查看>>
DataGridView的行的字体颜色变化
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Android-多线程AsyncTask
查看>>
LeetCode【709. 转换成小写字母】
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
【题解】青蛙的约会
查看>>
autopep8
查看>>