测试2
java-图灵-1
python-图灵-1

Hi,大家好,我是明哥。

在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。

我的在线博客:http://golang.iswbm.com
我的 Github:github.com/iswbm/GolangCodingTime

每个语言都有自己特色的编码规范,学习该语言的命名规范,能让你写出来的代码更加易读,更加不容易出现一些低级错误。

本文根据个人编码习惯以及网络上的一些文章,整理了一些大家能用上的编码规范,可能是一些主流方案,但不代表官方,这一点先声明一下。

1. 文件命名

_test.go文件名_平台.gomyblog.go

2. 常量命名

目前在网络上可以看到主要有两种风格的写法

  1. 第一种是驼峰命名法,比如 appVersion
  2. 第二种使用全大写且用下划线分词,比如 APP_VERSION

这两种风格,没有孰好孰弱,可自由选取,我个人更倾向于使用第二种,主要是能一眼与变量区分开来。

如果要定义多个变量,请使用 括号 来组织。

const (
	APP_VERSION = "0.1.0"
  CONF_PATH = "/etc/xx.conf"
)

3. 变量命名

驼峰命名法
HasIsCanAllowapiClientAPIClientURLString

这里列举了一些常见的特有名词:

// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{
    "API":   true,
    "ASCII": true,
    "CPU":   true,
    "CSS":   true,
    "DNS":   true,
    "EOF":   true,
    "GUID":  true,
    "HTML":  true,
    "HTTP":  true,
    "HTTPS": true,
    "ID":    true,
    "IP":    true,
    "JSON":  true,
    "LHS":   true,
    "QPS":   true,
    "RAM":   true,
    "RHS":   true,
    "RPC":   true,
    "SLA":   true,
    "SMTP":  true,
    "SSH":   true,
    "TLS":   true,
    "TTL":   true,
    "UI":    true,
    "UID":   true,
    "UUID":  true,
    "URI":   true,
    "URL":   true,
    "UTF8":  true,
    "VM":    true,
    "XML":   true,
    "XSRF":  true,
    "XSS":   true,
}

4. 函数命名

  1. 函数名还是使用 驼峰命名法
  2. 但是有一点需要注意,在 Golang 中是用大小写来控制函数的可见性,因此当你需要在包外访问,请使用 大写字母开头
  3. 当你不需要在包外访问,请使用小写字母开头

另外,函数内部的参数的排列顺序也有几点原则

  1. 参数的重要程度越高,应排在越前面
  2. 简单的类型应优先复杂类型
  3. 尽可能将同种类型的参数放在相邻位置,则只需写一次类型

5. 接口命名

使用驼峰命名法,可以用 type alias 来定义大写开头的 type 给包外访问。

type helloWorld interface {
    func Hello();
}

type SayHello helloWorld

当你的接口只有一个函数时,接口名通常会以 er 为后缀

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

5. 注释规范

注释分为

5.1 包注释

  1. 位于 package 之前,如果一个包有多个文件,只需要在一个文件中编写即可
  2. 如果你想在每个文件中的头部加上注释,需要在版权注释和 Package前面加一个空行,否则版权注释会作为Package的注释。
   
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package net
  1. 如果是特别复杂的包,可单独创建 doc.go 文件说明

5.2 代码注释

用于解释代码逻辑,可以有两种写法

///* comment */
// 单行注释

/*
多
行
注
释
*/

另外,对于代码注释还有一些更加苛刻的要求,这个看个人了,摘自网络:

  // Request represents a request to run a command.  type Request struct { ...
  // FileInfo is the interface that describes a file and is returned by Stat and Lstat.
  type FileInfo interface { ...
  // Post returns *BeegoHttpRequest with POST method.
  // Copy copies file from source to target path.
  // It returns false and error when error occurs in underlying function calls.
  // HasPrefix returns true if name has any string in given slice as prefix.
  func HasPrefix(name string, prefixes []string) bool { ...

5.3 特别注释

  • TODO:提醒维护人员此部分代码待完成
  • FIXME:提醒维护人员此处有BUG待修复
  • NOTE:维护人员要关注的一些问题说明

6. 包的导入

单行的包导入

import "fmt"
{}
import {
  "fmt"
  "os"
}

另外根据包的来源,对排版还有一定的要求

  1. 标准库排最前面,第三方包次之、项目内的其它包和当前包的子包排最后,每种分类以一空行分隔。
  2. 尽量不要使用相对路径来导入包。
import (
    "fmt"
    "html/template"
    "net/http"
    "os"
  
    "github.com/codegangsta/cli"
    "gopkg.in/macaron.v1"
  
    "github.com/gogits/git"
    "github.com/gogits/gfm"
  
    "github.com/gogits/gogs/routers"
    "github.com/gogits/gogs/routers/repo"
    "github.com/gogits/gogs/routers/user"
)

7. 善用 gofmt

除了命名规范外,Go 还有很多格式上的规范,比如

  1. 使用 tab 进行缩进
  2. 一行最长不要超过 80 个字符

因此在格式上的问题,你大部分都可以放心交由 gofmt 帮你调整。关于 gofmt 的文章还在写,应该这两天就会更新。你可以过两天再来看看。

参考文章:

系列导读

  • 还没有人评论,欢迎说说您的想法!