方法接收者(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.Conn 、http/ResponseWriter Error的命名Error类型应该写成FooError的形式 type ExitError struct { .... }
|
Error变量协程ErrFoo的形式 包的命名应当与它导出代码的内容相关,避免util 、common 这种宽泛的命名 引入路径包路径的最后一个单词应该和包名一致 包路径应该尽可能简洁 记得把库的主要代码直接放在代码库的根目录 避免在包路径中使用任何大写字母(并非所有文件系统都区分大小写) 标准库上述很多例子都是从标准库中来的 标准库的很多内容都可以作为参考 多看看标准库来寻求灵感吧 但是要记住: 当作者写标准库的时候,他们自己也在学习过程中。 多数情况下作者是对的,但是偶尔还是会犯一些错误 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)
|