保留字
在程序中不可以使用的名字
break,deafault,func,interface,select,case,defer,go,map,struct,chan,else,goto,
package,switch,const,fallthrough,if,range,type,continue,for,import,return,var
运算符
+ & += &= && == != ( )
- | -= |= || < <= [ ]
* ^ *= ^= <- > >= { }
/ << /= <<= ++ = := , ;
% >> %= >>= -- ! ... . :
&^ &^=
简单位运算符
0110 & 1011 = 0010 //AND 都为1
0110 | 1011 = 1111 //OR 至少一个为1
0110 ^ 1011 = 1101 //XOR 只能一个为1
0110 &^ 1011 = 0100 //AND NOT 清楚标志位 m &^ n 下面的数字是n的二进制是1值为0,二进制是0值为m中对应的值
标志位操作
a := 0
a |= 1 << 2 //<<左移运算符 比如:1<<2 则表示:1的二进制表示为:000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),那么像左移动两位则是000...000100
a |= 1 << 6 //a|=b表示的意思就是a=a|b(注意OR运算是需要先转换成二进制的)
a = a &^ (1 << 6)
不支持运算符重载
package main
import (
"fmt"
)
func main() {
n := 0
p := &n
//b := n++ //报错
//if n++ == 1 {} //报错
//++n //报错
n++
*p++
fmt.Println(n, p)
}
没有’~’,取反运算也用’^’
package main
import (
"fmt"
)
func main() {
x := 1
x = ^x
fmt.Println(x)
}
初始化符合对象,必须使用类型标签,且左大括号必须在类型尾部
package main
import (
"fmt"
)
func main() {
//var a struct{ x int } = { 100 } //报错
//var b []int = { 1, 2, 3 } //报错
//c := struct { x int; y string } //报错
//{
//}
var a = struct { x int } { 100 }
var b = []int{ //可以分行
1,
2,
3, //分开的话,最后一行要一个','
}
var c = []int{ //可以分行
1,
2,
3} //分开的话,最后一行要一个'}'
fmt.Println(a, b, c)
}
IF语句
可省略条件表达式括号
支持初始化语句,可定义代码块局部变量
代码块左大括号必须在条件表达式尾部
package main
import (
"fmt"
)
func main() {
x := 0
if n := "abc"; x>10 {
fmt.Println(n[1])
} else if x <0 {
fmt.Println(n[2])
} else {
println(n[0])
}
}
不支持三元运算符
package main
func main() {
a := 0
b := 1
c := a > b ? a : b //报错
println(c)
}
For(循环语句)
package main
func main() {
s := "abc"
//常见的for循环方式
for i,n :=0, len(s); i < n; i++ {
println(i)
}
//while的for循环方式
n := len(s)
for n > 0 {
println(n)
n--
}
//while(true) {} 死循环
for {
println(s)
}
}
Range(类似迭代器操作,返回键值)
package main
func main() {
s := "abc"
for i := range s { //默认忽略值,只把键赋值给了i变量
println(i, s[i])
}
for _, c := range s { //默认丢弃了键,把值赋给了c变量
println(c)
}
var d = 0
for range s { //抛弃键值,只循环
d++
}
println(d)
m := map[string]int{"a":1, "b":2}
for k,v := range m { //遍历出键值
println(k,v)
}
}
switch
package main
func main() {
x := []int{1, 2, 3}
i := 3
switch i {
case x[1]:
println("a")
case x[2], 1:
println("b")
default:
println("c")
}
}
package main
func main() {
x := 10
switch x {
case 10:
println("a")
fallthrough //需要继续下一分支,使用fallthrough
case 0:
println("c")
}
}
package main
func main() {
x := []int{1, 2, 3}
switch {
case x[1] > 0: //当做if else使用
println("a")
case x[1] < 0:
println("b")
default:
println("c")
}
}
package main
func main() {
x := []int{1, 2, 3}
switch i := x[2]; { //带初始值
case i > 0:
println("a")
case i < 0:
println("b")
default:
println("c")
}
}
goto语句
package main
func main() {
var i int
for {
println(i)
i++
if i > 2 {
goto TEST
}
}
TEST:
println("break")
}
break和continue
package main
func main() {
L1:
for x := 0;x < 3; x++ {
L2:
for y := 0;y < 5;y++ {
if y > 2 {
continue L2
}
if x > 1 {
break L1 //break可用于for,switch,select而continue只能用于for循环
}
print(x, ":", y, " ")
}
println()
}
}