记录一些GOLANG容易忽略的小细节
:= 必须确保至少有一个变量是用于声明的,即:
var err
file,err := xxx
如果file在同级词法域被声明过,那么file和err都不能被:=声明,编译器会报no new variables on left side of :=。显然是不行的,因此至少有一个变量是可以用来声明的,如果变量是在外部词法域声明的,那么:=
将会在当前词法域重新声明一个新的变量。也要注意err在这里其实只是赋值。
常量的值必须在编译阶段就确定的值,即:
const Home = os.GetEnv("HOME") //错误写法,只能在运行阶段才能确定
const varVal = 4 + 7 //正确写法,在编译阶段能确认的值,
值类型和引用类型
值类型
整型(int8,uint等) # 基础类型之数字类型
浮点型(float32,float64) # 基础类型之数字类型
复数() # 基础类型之数字类型
布尔型(bool) # 基础类型
字符串(string) # 基础类型
数组 # 复合类型
结构体(struct) # 复合类型
引用类型
指针
切片(slice)
字典(map)
函数
管道(chan)
接口(interface)
关键字iota声明初始值为0,每行递增1,如果都在一行,则值都一样
const (
g = iota //0
h,i,j = iota,iota,iota
k // 这一行会报错。
)
自增自减不能用于表达式中,只能独立使用,即:
a = i++ //错误用法
if i++ > 0 {} //错误用法
i++ //正确用法
Switch 语句默认使用break
switch num {
case 1: // case 中可以是表达式
fmt.Println("111")
case 2:
fmt.Println("222")
default:
fmt.Println("000")
}
- Go保留了
break
,用来跳出switch语句,上述案例的分支中默认就书写了该关键字 - Go也提供
fallthrough
,代表不跳出switch,后面的语句无条件执行
常用的跳出循环的关键字
- break
用于函数内跳出当前
for、
switch、
select`语句的执行 continue
用于跳出for
循环的本次迭代。goto
可以退出多层循环
运算符
算术运算符: + - * / % ++ --
关系运算符: == != <= >= < >
逻辑运算符: ! && ||
位运算: &(按位与) |(按位或) ^(按位取反) <<(左移) >>(右移)
赋值运算符: = += -= *= /= %= <<= >>= &= ^= |=
其他运算符: &(取地址) *(取指针值)
未使用的变量
golan 只有在函数里面定义的变量未使用会报错,但是包的全局变量即使未使用也不会报错。