变量
声明
var a ="initial"
var c int = 1,2
f := float32(e)
数组
var a [5]int
b := [5]int{1,2,3,4,5}
var t [2][3]int
for i :=0;i <2;i++{
for j:= 0;j < 3;j++{
two[i][j] = i + j
}
}
切片
可变长度的数组
s := make([string,3])
s[0] = "a"
s[1] = "b"
s[2] = "c"
s= append(s,"d") //[a,b,c,d]
map
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
结构体
type user struct{
name string
password string
}
//成员函数
func(u user) checkPassword(password string) bool{
return u.password == password
}
func(u* user) setPassword(password string){
u.password = password
}
func main(){
a := user{name:"wang" ,password:"1025"}
a.password = "1024"
}
错误处理
func findUser(users []user,name string)(v* user,err error){
return &u,nil
return nil,errors.N
}
字符串格式化
%v变量结构体会输出p={属性1 属性2..}
%+v输出p={属性名:属性1 属性名2:属性2}
%#v输出p={属性名:main.Point{x:1,y:2}}
浮点数和c相同
JSON
可以通过Marshal(结构体)进行序列化操作
数字转换
strconv把字符串转换为数字。
输入
reader := bufio.NewReader(os.Stdin)
input,err :=reader.ReadString('\n')
if err !=nil{
return
}
input = string.TrimSuffix(input,"\n")
编码规范
代码格式
go语言内置格式化功能。
goimports可以自动增删依赖包使用,并排序。
注释
-
解释代码作用
对函数、变量的功能进行说明
-
解释代码如何做的
解释代码的实现过程
-
解释代码实现的原因
解释代码的外部因素
-
解释代码什么情况会出错
解释代码的限制条件
命名规范
变量
- 缩略词全大写
- 变量距离使用的地方越远,名字应该越长,携带更多的信息
函数
- 函数名尽量简短。
- 不携带包名的上下文信息
- 返回类型和包名一样时,可以省略类型信息。
- 返回类型和包不一样时,加入类型信息。
包
- 不包含大写字母和下划线。
- 包含一定的上下文信息,
- 不与标准库,常用变量同名
- 使用单数
- 谨慎使用缩写
控制流程
-
避免分支嵌套
\\bad
if foo{
return x
}else{
return nil
}
\\good
if foo{
return x
}
return nil
-
尽量保持正常代码路径为最小缩进
优先处理错误情况/特殊情况,尽早返回或继续循环来减少嵌套。
错误和异常处理
简单错误
func defaultCheckRedirect(req *Request,via []*Request) error{
if len(via) >=10{
return errors.new("")
}
return nil
}
panic
- 不建议使用panic
- 建议使用error代替
recover
- 只能在被defer函数中使用。
- 只能在当前goroutine生效