Go基础语法-2 | 青训营笔记
Go 语言的设计目的是作为 C/C++ 的替代工具,是谷歌内部为了解决 C/C++ 开发中的一些痛点:编译慢、不受控制的依赖、三方库混乱、编程范式繁多(每个人都选择其中一部分特性)、并发编程麻烦、跨平台代码兼容、内存安全、工程开发效率低等等。
目录
- <条件语句>
- <循环语句>
- <range遍历>
条件语句
1. if语句
- 无需添加()
- 可以在if开始前初始化语句中的局部变量
if a>12 {
fmt.Println("a>12")
}
if a := 3; a>12 {
fmt.Println("a>12")
}else if a<=2 {
fmt.Println("a<=2")
}else{
fmt.Println("2<a<=12")
}
2. switch
- 无需添加 break,go语言默认没有switch穿透,
- 变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。
switch var1 {
case val1:
...
case val2:
...
default:
...
}
- switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型。
switch x.(type){
case type:
statement(s);
case type:
statement(s);
default:
statement(s);
}
- 使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
package main
import "fmt"
func main() {
switch {
case false:
fmt.Println("case1 条件语句为 false")
fallthrough
case true:
fmt.Println("case2 条件语句为 true")
fallthrough
case false:
fmt.Println("case3 条件语句为 false")
fallthrough
case true:
fmt.Println("case4 条件语句为 true")
case false:
fmt.Println("case5 条件语句为 false")
fallthrough
default:
fmt.Println("默认")
}
}
3. select(对通道功能的增强)
- select 是 Go 中的一个控制结构,类似于 switch 语句。
- select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。
- select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。
- 如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。
-
每个 case 都必须是一个通道
-
所有 channel 表达式都会被求值
-
所有被发送的表达式都会被求值
-
如果任意某个通道可以进行,它就执行,其他被忽略。
-
如果有多个 case 都可以运行,select 会随机公平地选出一个执行,其他不会执行。
否则:
- 如果有 default 子句,则执行该语句。
- 如果没有 default 子句,select 将阻塞,直到某个通道可以运行(select 会循环检测条件,如果有满足则执行并退出,否则一直循环检测。)Go 不会重新对 channel 或值进行求值。
循环语句
1. for
go没有while语句和do-while语句,只有for语句,不过for循环取代了whlie循环的功能
for a:=1;a<10 {
a++
}
for {
//无限循环相当于whlie(true){}
if a<10{
break
}
}
2. 跳转语句
-
break
暂停并跳出循环(下面是我直接从自己的java教学中抄出来的代码,只删除了三个括号和几个分号)
a:for {
b:for {
//执行语句...
if 条件表达式 {
break a
}
//执行语句...
}
}
-
continue
暂停并进行下一次循环(下面是我直接从自己的java教学中抄出来的代码,只删除了三个括号和一个分号)
a:for ;;更新表达式1 {
b:for ;;更新表达式2 {
//执行语句...
if 条件表达式 {
continue a
}
//还是我,执行语句...
}
}
-
goto
无条件跳转语句,老规矩,虽然没有去掉这个语句,但是在一般情况下,谁用,打死他。
range遍历
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:
for key, value := range oldMap {
newMap[key] = value
}
以上代码中的 key 和 value 是可以省略。
如果只想读取 key,格式如下:
for key := range oldMap
或
for key, _ := range oldMap
如果只想读取 value,格式如下:
for _, value := range oldMap