GOROOT=/usr/local/lib/golang
GOPATH=/root/go
go version go1.10.3 linux/amd64
mkdir -p /root/go/src/k8s.io
cd /root/go/src/k8s.io/
git clone https://github.com/kubernetes/kubernetes.git
目录展示:
主要目录:
目录名 | 功能 |
---|---|
cmd | 每个组件代码入口(main函数) |
pkg | 各个组件的具体功能实现 |
staging | 已经分库的项目 |
vendor | 依赖 |
GO语言的关键特性主要包括以下几方面:
package名字
保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。
import 规范
import在多行的情况下,自动工具会自动帮你格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式:
import (
"fmt"
)
如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包:
import (
"strings"
"myproject/models"
"myproject/controller"
"github.com/mysql"
)
有顺序的引入包,不同的类型采用空格分离,第一种实标准库,第二是项目包,第三是第三方包。在项目中不要使用相对路径引入包:
// 这是不好的导入
import “../pkg”
// 这是正确的做法
import “github.com/tx23/pkg”
var (
Found bool
count int
)
type MyInt int
func (m MyInt) String() string {
return fmt.Sprint(m) //BUG:死循环
}
func(m MyInt) String() string {
return fmt.Sprint(int(m)) //这是安全的,因为我们内部进行了类型转换
}
func Foo(a int, b int) (string, ok){
}
当然如果是有多个相同类型的参数返回,那么命名参数可能更清晰。
func (f *Foo) Location() (float64, float64, error)
错误处理
错误处理的原则就是不能丢弃任何有返回err的调用,不要采用_丢弃,必须全部处理。接收到错误,要么返回err,要么实在不行就panic,或者使用log记录下来,error的信息不要采用大写字母,尽量保持你的错误简短,但是要足够表达你的错误的意思。
注意闭包的调用
在循环中调用函数或者goroutine方法,一定要采用显示的变量调用,不要再闭包函数里面调用循环的参数
fori:=0;i<limit;i++{
go func(){ DoSomething(i) }() //错误的做法
go func(i int){ DoSomething(i) }(i)//正确的做法
?}
在逻辑处理中禁用panic
在main包中只有当实在不可运行的情况采用panic,例如文件无法打开,数据库无法连接导致程序无法正常运行,但是对于其他的package对外的接口不能有panic,只能在包内采用。强烈建议在main包中使用log.Fatal来记录错误,这样就可以由log来结束程序。
struct规范
struct申明和初始化格式采用多行:
定义如下:
type User struct{
Username string
Email string
}
初始化如下:
u := User{
Username: "astaxie",
Email: "astaxie@gmail.com",
}
func(w Win) Tally(playerPlayer)int //w不会有任何改变
func(w *Win) Tally(playerPlayer)int //w会改变数据
更多的请参考:
https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Type
参考资料:
https://code.google.com/p/go-wiki/wiki/CodeReviewComments
http://golang.org/doc/effective_go.html
原文:https://www.cnblogs.com/tangxin2019/p/11615739.html