Go语言学习技巧之命名规范

 更新时间:2017年12月14日 09:30:34   作者:Zachary Marv  
最近在学习go语言,发现了不少需要整理的知识点,所以整理下分享出来,下面这篇文章主要给大家介绍了关于Go语言学习技巧之命名规范的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

本篇主要讲述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
  • 在很长的函数中可能会有很多的变量,这个时候可以适当使用一些长名字。
  • 但是写出这么长的函数,通常意味着代码需要重构了!🙅🏻‍

参数

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

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

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

您可能感兴趣的文章:

相关文章

  • Golang 语言map底层实现原理解析

    Golang 语言map底层实现原理解析

    这篇文章主要介绍了Golang 语言map底层实现原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 对Golang中的FORM相关字段理解

    对Golang中的FORM相关字段理解

    这篇文章主要介绍了对Golang中的FORM相关字段理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 解决Golang中ResponseWriter的一个坑

    解决Golang中ResponseWriter的一个坑

    这篇文章主要介绍了解决Golang中ResponseWriter的一个坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go中map数据类型3点小知识

    Go中map数据类型3点小知识

    这篇文章主要介绍了Go中map数据类型3点小知识,在go中使用map时可能会用本文中的小知识,需要的朋友可以参考下
    2014-10-10
  • GO语言实现的端口扫描器分享

    GO语言实现的端口扫描器分享

    这篇文章主要介绍了GO语言实现的端口扫描器分享,本文直接给出实现代码,代码中包含大量注释,需要的朋友可以参考下
    2014-10-10
  • 详解go中panic源码解读

    详解go中panic源码解读

    这篇文章主要介绍了go中panic源码解读,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • go语言读取json并下载高清妹子图片

    go语言读取json并下载高清妹子图片

    前面我们介绍了使用python下载高清妹子图,作为程序猿,我们当然不能只会一种语言,今天我们就来使用go语言来读取API来下载妹子图吧,有需要的宅男们可以参考下。
    2015-03-03
  • Go语言实现登录验证代码案例

    Go语言实现登录验证代码案例

    这篇文章主要介绍了Go语言实现登录验证代码案例,代码和图文讲解的很清晰,有感兴趣的可以学习下
    2021-03-03
  • Go语言中的指针运算实例分析

    Go语言中的指针运算实例分析

    这篇文章主要介绍了Go语言中的指针运算技巧,实例分析了Go语言指针运算的实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • golang socket断点续传大文件的实现方法

    golang socket断点续传大文件的实现方法

    今天小编就为大家分享一篇golang socket断点续传大文件的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论