Go基础 —— 目录
一、运算符
优先级 | 分类 | 运算符 | 结合性 |
---|---|---|---|
1 | 逗号运算符 | , | 从左到右 |
2 | 赋值运算符 | = += -= *= /= %= >= <<= &= ^= |= | 从右到左 |
3 | 逻辑或 | || | 从左到右 |
4 | 逻辑与 | && | 从左到右 |
5 | 按位或 | | | 从左到右 |
6 | 按位异或 | ^ | 从左到右 |
7 | 按位与 | & | 从左到右 |
8 | 相等/不相等 | == != | 从左到右 |
9 | 关系运算符 | < <= > >= | 从左到右 |
10 | 位移运算符 | << >> | 从左到右 |
11 | 加法/减法 | + - | 从左到右 |
12 | 乘法/除法/取余 | *(乘号) / % | 从左到右 |
13 | 单目运算符 | ! *(指针) & ++ -- +(正好) -(负号) | 从右到左 |
14 | 后缀运算符 | () [] -> | 从左到右 |
注意:优先级值越大,表示优先级越高
二、条件语句
2.1 基本写法
if condition {
// do something
} else if confition2 {
// do something
} else {
// do something
}
2.2 特殊写法
if 还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断,代码如下:
if err := Connect(); err != nil {
fmt.Println(err)
return
}
Connect
是一个带有返回值的函数,err:=Connect()
是一个语句,执行Connect
后,将错误保存到err
变量中。
err != nil
才是if
的判断表达式,当err
不为空时,打印错误并返回。
这种写法可以将返回值与判断放在一行进行处理,而且返回值的作用范围被限制在 if、else 语句组合中。
在编程中,变量的作用范围越小,所造成的问题可能性越小,每一个变量代表一个状态,有状态的地方,状态就会被修改,函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限制变量的作用范围对代码的稳定性有很大的帮助。
三、循环语句 for
Go语言中的循环语句只支持for
关键字
3.1 基本写法
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
3.2 无限循环
sum := 0
for {
sum++
if sum > 100 {
break
}
}
3.3 for
中的初始语句(开始循环时执行的语句)
初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。
step := 2
for ; step > 0; step-- {
fmt.Println(step)
}
3.4 for
中的条件表达式(控制是否循环的开关)
var i int
for ; ; i++ {
if i > 10 {
break
}
}
var i int
for {
if i > 10 {
break
}
i++
}
var i int
for i <= 10 {
i++
}
3.5 for
中的结束语句(每次循环结束时执行的语句)
在结束每次循环前执行的语句,如果循环被 break、goto、return、panic 等语句强制退出,结束语句不会被执行。
四、键值循环 for range
4.1 基本写法
for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel),for range 语法上类似于其它语言中的 foreach 语句,一般形式为:
for key, val := range coll {
...
}
通过 for range 遍历的返回值有一定的规律:
- 数组、切片、字符串返回索引和值。
- map 返回键和值。
- 通道(channel)只返回通道内的值。
4.2 遍历数组、切片(获得索引和值)
for key, value := range []int{1, 2, 3, 4} {
fmt.Printf("key:%d value:%d\n", key, value)
}
4.3 遍历字符串(获得字符)
var str = "hello 你好"
for key, value := range str {
fmt.Printf("key:%d value:0x%x\n", key, value)
}
4.4 遍历map
(获得map
的键和值)
m := map[string]int{
"hello": 100,
"world": 200,
}
for key, value := range m {
fmt.Println(key, value)
}
4.5 遍历通道channel
(接收通道数据)
c := make(chan int)
go func() {
c <- 1
c <- 2
c <- 3
close(c)
}()
for v := range c {
fmt.Println(v)
}
4.6 在遍历中选择希望获得的变量
m := map[string]int{
"hello": 100,
"world": 200,
}
for _, value := range m {
fmt.Println(value)
}
五、Switch case
5.1 基本写法
var a = "hello"
switch a {
case "hello":
fmt.Println(1)
case "world":
fmt.Println(2)
default:
fmt.Println(0)
}
注意:
- 支持一分支多值,不同的
case
表达式用逗号分隔 - 支持分支表达式,这种情况
switch
后面不再需要跟判断变量
var a = "mum"
switch a {
case "mum", "daddy":
fmt.Println("family")
}
var r int = 11
switch {
case r > 10 && r < 20:
fmt.Println(r)
}
5.2 跨越case
的fallthrough
在Go语言中 case 是一个独立的代码块,执行完毕后不会像C语言那样紧接着执行下一个 case,但是为了兼容一些移植代码,依然加入了 fallthrough 关键字来实现这一功能,代码如下:
var s = "hello"
switch {
case s == "hello":
fmt.Println("hello")
fallthrough
case s != "world":
fmt.Println("world")
}
注意:
- 新编写的代码,不建议使用
fallthrough