极乐门资源网 Design By www.ioogu.com

前言

本篇主要讲述Go语言的命名规范。优秀的代码必须具备良好的可读性,而可读性的关键即在于命名风格。

Go的函数、变量、常量、自定义类型、包(Package)的命名方式遵循以下规则:

      1)首字符可以是任意的Unicode字符或者下划线

      2)剩余字符可以是Unicode字符、下划线、数字

      3)字符长度不限

Go只有25个关键字

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

优秀的命名

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

首条经验

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

骆驼命名法

  • Go语言应该使用 MixedCase
  • (不要使用 names_with_underscores)
  • 首字母缩写词都应该用大写,譬如ServeHTTP、sceneID、CIDRProcessor。

局部变量

  • 局部变量应当尽可能短小,譬如使用buf指代buffer,使用i指代index
  • 在很长的函数中可能会有很多的变量,这个时候可以适当使用一些长名字。
  • 但是写出这么长的函数,通常意味着代码需要重构了!"color: #ff0000">参数

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

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

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

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

    func Unix(sec, nsec int64) Time
    func HasPrefix(s, prefix []byte) bool

    返回值

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

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

    func Copy(dst Writer, src Reader) (written int64, err error)
    func ScanBytes(data []byte, atEOF bool) (advance int, token []byte,
     err error)

    方法接收者(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的形式

    var ErrFormat = errors.New("unknown format")

    包的命名

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

    引入路径

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

    包路径应该尽可能简洁

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

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

    标准库

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

    标准库的很多内容都可以作为参考
    多看看标准库来寻求灵感吧

    但是要记住:

    当作者写标准库的时候,他们自己也在学习过程中。
    多数情况下作者是对的,但是偶尔还是会犯一些错误

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

    参考文献

    What's in a name? - Andrew Gerrand

标签:
go,命名规范,go语言规范,go语言编码规范

极乐门资源网 Design By www.ioogu.com
极乐门资源网 免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
极乐门资源网 Design By www.ioogu.com

评论“Go语言学习技巧之命名规范”

暂无Go语言学习技巧之命名规范的评论...

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?