今天学习一些运算符和学习一些关键字的使用
运算符
& | ^ &^
这四个位运算符分别是按位与,按位或,按位异或,位清除
其中位清除是GoLang特有的
a&^b使得a发生变化,a与b相同的位清零,a与b不同的位保留
a&^b相当于a&^=b,相当于a&=~b
Go不支持运算符、方法重载,但是某些内建运算符支持重载,比如+可以连接int32,也可以连接float32等
控制结构
Go没有do,while循环
if-else
强制写大括号,并且if的{和if必须在同一行,if的}必须和else在同一行
package main
import (
"fmt"
)
func main() {
var e bool
if !e {
fmt.Println("ee")
} else {
fmt.Println("e")
}
}
if和switch都支持声明局部变量
package main
import (
"fmt"
)
func main() {
if a := 0; a == 0 {//不允许声明a为var
fmt.Println(a)
//0
}
}
for
for有三种格式
- for init;condition;post{} //和C一样
- for condition{} //和while一样
- for{} //和while(1)一样
attention:Go没有逗号表达式,所以当for循环要同时控制多个序号变量,应当用平行赋值
i,j=i+1,j+2
可以给循环加label,然后指定break某一个label所指的循环,不使用的label不可以加
package main
import (
"fmt"
)
func main() {
J:
for j := 0; j < 2; j++ {
for i := 0; i < 8; i++ {
if i > 5 {
break J
}
fmt.Println(i)
}
fmt.Println("i am j")
}
}
输出
0
1
2
3
4
5
package main
import (
"fmt"
)
func main() {
for j := 0; j < 2; j++ {
for i := 0; i < 8; i++ {
if i > 5 {
break
}
fmt.Println(i)
}
fmt.Println("i am j")
}
}
输出
0
1
2
3
4
5
i am j
0
1
2
3
4
5
i am j
range
range是一个迭代器,使用时他返回一个根据类型而定的键值对
package main
import (
"fmt"
)
func main() {
list := []string{"aa", "bb", "cc", "dd"}
for k, v := range list {
fmt.Print(k)
fmt.Print(" ")
fmt.Println(v)
fmt.Println()
}
}
输出
0 aa
1 bb
2 cc
3 dd
直接在string上使用range,会使字符串打散成Unicode,并按UTF-8开始解析
package main
import (
"fmt"
)
func main() {
var s string = "aΩx"
for pos, char := range s {
fmt.Printf("character '%c' starts at byte position %d\n", char, pos)
}
}
输出(Ω占两个字节)
character 'a' starts at byte position 0
character 'Ω' starts at byte position 1
character 'x' starts at byte position 3
switch
Go的switch非常灵活,它的表达式不必是常量或整数,他可以放condition,甚至init,假如switch没有表达式,自动匹配true
教程上给了这个函数,但是不是很懂它的用法,难道是要把一个16进制数打散成byte看它每一个byte是不是在0-9,a-f,A-F吗。
func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
return c - '0'
case 'a' <= c && c <= 'f':
return c - 'a' + 10
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
return 0
}
fallthrough
C语言中,一项case匹配了也会自动往下匹配,除非有break,而Go是默认匹配到一项就不往下匹配了,除非有fallthrough
package main
import (
"fmt"
)
func main() {
var i int = 0
switch i {
case 0:
case 1:
fmt.Println("111")
}
}
//无输出
package main
import (
"fmt"
)
func main() {
var i int = 0
switch i {
case 0:
fallthrough
case 1:
fmt.Println("111")
}
}
//输出111
package main
import (
"fmt"
)
func main() {
var c byte = '&'
switch c {
case ' ', '?', '&'://注意这里的逗号代表or
fmt.Println("hello")
default:
fmt.Println("default")
}
}
//输出hello