注意事项
运算符
tips
- Go中的运算符都是从左到右结合的
- 优先级从高到低:
移位运算
a << 10
//a*(2^10)
//右移类似
位运算符
/*
6 : 0110
11: 1011
----------
& 0010
| 1111
^ 1101
&^ 0100
//第四个运算符是,第二行这一位如果是1,就上0,如果是0,就上第一行该位置的数
*/
运算符&&和||
- &&如果第一个不符合,就不会计算第二个表达式
- II同理如果第一个符合了,就不会去计算第二个表达式
指针
- Go中虽然保留了指针,但是不支持指针运算以及"->"运算符,直接采用"."来操作指针目标对象成员
- 操作符"&"去变量地址,使用"*"通过指针间接访问目标对象
- 默认值是nil,不是NULL
递增递减语句
- 在Go中,++与--作为语句而不是表达式
- 表达式是可以放在等号右边的,语句不可以
- 而且 --a 是不可以的,a-- 才行
控制语句
判断语句if
- 不加括号,一个空格就行
- 可以加一个局部变量的初始化,定义域只在if语句中
if a:=1 ; a>0 { }
- 左大括号必须和if语句在同一行
循环语句for
- 只有for一个循环语句关键字,但是支持三种形式
- 左大括号要和for关键字在同一行
- 初始化和步进表达式可以是多个值
- 条件语句每次都会被检查,故不建议在条件语句中使用函数,尽量提前计算好条件,并用变量或者向量代替
func main(){
a := 1
for {
a++
if a>3 {
break;
}
}
//do...while型
}
func main(){
a := 1
for a<=3 {
a++
}
//while型
}
func main(){
a := 1
b := "string"
l := len(b)
for i := 0; i<l ; i++{
a++
}
//for型
}
选择语句switch
- 左大括号必须与switch在一行
- case后面的条件语句可以是任何类型或者表达式
- 不需要写break,一旦符合条件就会自动终止,如果想继续执行下一个case,需要加上 fallthrough 语句
- switch后面可以加一个初始化表达式,要加分号,如果只是单纯的变量名,不用加分号
func main(){
a := 1
switch a {
case 0:
fmt.Println("a=0")
case 1:
fmt.Println("a=1")
default:
fmt.Println("nothing")
}
fmt.Println(a)
}
//a=1
//1
func main(){
a := 1
switch {
case a>=0:
fmt.Println("a=0")
fallthrough
case a>=1:
fmt.Println("a=1")
default:
fmt.Println("nothing")
}
fmt.Println(a)
}
/*
a=0
a=1
1
*/
func main(){
a := 6
switch a := 0; {
case a>=0:
fmt.Println("a=",a)
a++
fallthrough
case a>=1:
fmt.Println("a=",a)
default:
fmt.Println("nothing")
}
fmt.Println(a)
}
/*
a= 0
a= 1
6
*/
跳转语句goto, break, continue
- 三个语法都可以配合标签使用
- 标签名区分大小写,若不使用会造成编译错误
- break和continue配合标签可以用于多层循环的跳出,如果没有用标签,就是正常的作用
- goto是调整执行位置,与其他两个语句配合标签的结果并不一样
func main(){
LABEL1:
for {
for i:=0 ; i< 10 ;i++ {
if i>3 {
break LABEL1
//continue LABEL1 死循环
//goto LABEL1 重新执行这个大循环
}
}
}
}