Go

Golang编码规范

Posted on 2018-08-12

Gofmt

大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码一致的格式。控制间距,锁进。

注释

注释可以通过godoc导出生成文档。

程序中每一个被导出的(大写的)名字,都应该有一个文档注释。

包注释

每个程序包都应该有一个包注释,一个位于package子句之前的块注释或行注释。

包如果有多个go文件,只需要出现在一个go文件中即可。

1
2
3
//Package regexp implements a simple library
//for regular expressions.
package regexp

可导出类型

第一条语句应该为一条概括语句,并且使用被声明的名字作为开头。public函数名大写。

1
2
3
// Compile parses a regular expression and returns, if successful, a Regexp
// object that can be used to match against text.
func Compile(str string) (regexp *Regexp, err error) {}

命名

  • 包名
    包名应该为小写单词,不要使用下划线或者混合大小写。

  • 接口名
    单个函数的接口名以”er”作为后缀,如Reader,Writer
    接口的实现则去掉“er”

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

    两个函数的接口名综合两个函数名

    1
    2
    3
    4
    type WriteFlusher interface {
    Write([]byte) (int, error)
    Flush() error
    }

    三个以上函数的接口名,类似于结构体名

    1
    2
    3
    4
    5
    type Car interface {
    Start([]byte)
    Stop() error
    Recover()
    }
  • 变量

    1
    2
    3
    全局变量:驼峰式,结合是否可导出(是否public)确定首字母大小写
    参数传递:驼峰式,小写字母开头
    局部变量:下划线形式

控制结构

  • if 接受初始化语句

    1
    2
    3
    if err := file.Chmod(0664); err != nil {
    return err
    }
  • for 采用短声明建立局部变量

    1
    2
    3
    4
    sum := 0
    for i := 0; i < 10; i++ {
    sum += i
    }
  • range 遍历slice或map

    1
    2
    3
    for k, v := range myslice{} // get key and value
    for k := range myslice{} //only get key
    for _, v:= range myslice{} //only get value

函数

  • 函数采用命名的多值返回
  • 传入变量和返回变量以小写字母开头
    1
    func nextInt(b []byte, pos int) (value, nextPos int) {}

import

  • goimports实现了自动格式化
  • 对import的包进行分组管理,而且标准库作为第一组
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package main

    import (
    "fmt"
    "hash/adler32"
    "os"

    "appengine/user"
    "appengine/foo"

    "code.google.com/p/x/y"
    "github.com/foo/bar"
    )

缩写

  • 采用全部大写或者全部小写来表示缩写单词
    比如对于url, 要用urlPony或者URLPony