effectiveGO(01)--go工具与规范

1. golang 工具与规范

1.1 格式化

如果想要团队项目中所有人都遵循相同的代码规范,可以使用 go fmt 格式化你的代码(比如说代码自动对齐、注释对齐。简直是造福了我这种强迫症)

1.2 注释

go语言支持块注释 /* */ 和 行注释 //

1.3 文档

go 语言可以为你的源码自动生成文档,而仅需你在写注释的时候遵循一定的规则:

1. 查看 doc 的方式有两种:
  1. godoc -http:=8080(将运行一个web服务器,在浏览器中输入 localhost:8080 即可浏览)
  2. package_name go doc(将在终端直接输出 package_name 的 doc)
2. 注释应该直接加在声明前,其之间不能存在空行。
3. 距离注释符 2 个以上空格的内容将被看做代码块
4. 一个例子如下:
// hello 包是用于演示 go doc 工具的一个包
// (package的注释将作为package的摘要和Overview)
//   距离注释符两个空格以上的距离的内容在 doc 中被解释为代码块
// 而距离注释符0个或1个空格则是普通的一行
//   还需要说明的是,doc 的生成是以包为单位的,而不是单个go文件。
package hello

import "fmt"

// Struct01 这是一个结构体
type Struct01 struct{
	var01 int // 私有的变量不会展现在 doc 中
	Var02 int // 公共的变量将展现在 doc 中
}

// 这是一个错误的范例,注释和函数声明之间存在一个空行,将无法为TestFunc01生成文档

func TestFunc01() {

}

// TestFunc02 该函数实现了***功能(此行将作为摘要)
// 这一行可以写函数的详细介绍(只有注释紧接着声明,注释才会被整理到Doc中)
func TestFunc02() {
	fmt.Println("")
}

// TestFunc03 该函数实现了***功能
// 这一行可以写函数的详细介绍()
// 那么这一行呢?
func TestFunc03() (flag bool){
	fmt.Println("")
	return true
}

运行 godoc -http:=8080 后将在浏览器中输入 localhost:8080/pkg 将看到本机所有的 doc:
[浏览 localhost:8080]

1.4 包

1.4.1 包引用
  1. 绝对路径引用。go 会自动在 GOROOT(安装go后自动生成,即 go 的安装目录) 和 GOPATH(自己在环境变量中配置,类似 java 的 CLASSPATH) 下寻找你要引用的包。例如hex(16进制转换包)包在 go 源码中的目录路径是:src/pkg/encoding/hex,那么在项目中的引用方式是:
import "encoding/hex"
  1. 相对路径引用。以当前文件位置为起点。不建议使用这种引用方式。
import "../model" // 引用同一目录下的 model 包
  1. 点引用。使用点引用的包在调用包内函数时可以省略包名(易造成冲突,不推荐)
import . "fmt" 
Println("这样就可以直接引用 Println() 函数而不需要使用 fmt. 前缀了")
  1. 别名引用。顾名思义。
import f "fmt"
f.Println("使用 f 这个别名来代替 fmt 这个别名")
  1. _引用。import 包时首先会执行包中的 init() 函数,其次我们就可以使用 '包名.函数名’来引用包中的内容,有时候我们仅仅想引用包中的 init() 函数,但并不需要用到包中的内容,此时就可以用 ‘_’ 引用。需要注意的是,使用 ‘_’ 的包无法调用该包中的内容
import _ "fmt"
  1. ’打包’引用。一次性 import 多个包
import (
    "fmt"
    "math"
)
1.4.2 关于包的其他知识
  • 同一个包下的 go 文件中的内容可以相互调用(唯一的特例是 main 包,如果 main 包下有多个文件,且在 main 方法中调用了 main 包下其他 go 文件中的方法,则需要 go run *.go 才能运行)

1.5 命名规范(官方推荐)

golang 中包、函数等等的官方命名规范。养成良好的命名规范对代码的质量有很强的提升作用。

1. 包名

包名小写,不建议在包名中使用下划线和驼峰记法

2. getter 和 setter

golang 中没有类的说法,但我们可以借鉴面向对象思想中的封装,将所有字段设为 private,然后按照情况提供 getter 和 setter。推荐的 getter 即字段名首字母大写即可,setter 即 'Set字段名’即可。

<!-- 
type User struct{
    name string
} 
-->
user := new model.User()
// getter 方法,字段首字母大写即可
func Name()(string){
    return user.name
}
// setter 方法,'Set字段名'即可
func SetName(name){
    user.name = name
}
3. 分号

在编程过程中分号可写可不写,但是进行编译时,go 的词法分析器将会自动为你的代码插入分号。

  • 【注意】控制结构(if、for、switch、select)的左大括号不能放在下一行(否则会在大括号之前插入一条分号)
// 正确
if i < j {

}
// 错误
if i < j 
{  // 左大括号不能在下一行

}
4. 接口名

约定,只包含一个方法的接口应当以该方法的名称加上-er后缀来命名,如 Reader、Writer、 Formatter、CloseNotifier 等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值