Golang 语言基础之二: for, ifelse, switch
Golang 语言基础系列:
- Golang 语言基础之一: type, variable, constant
- Golang 语言基础之二: for, ifelse, switch
- Golang 语言基础之三: array, slice
- Golang 语言基础之四: map, range
- Golang 语言基础之五: function
- Golang 语言基础之六: string, pointer
- Golang 语言基础之七: struct, method
- Golang 语言基础之八: interface
- Golang 语言基础之九: error, panic, recover
- Golang 语言基础之十: goroutine, channel
For 循环
Golang 中没有 while
语句。循环语句只有 for
。而且配合 range
表达式可以方便地以迭代器的形式访问 Golang 中 string
, array
, slice
, map
, channel
类型对象的元素。
下面的实例代码演示了 for
语句的常用方法:
package main
import "fmt"
func main() {
v_str := "post hoc"
fmt.Println("Test str: ", v_str)
// 类似于 C/C++ 语言的传统使用方式
for i := 0; i < 4; i++ {
fmt.Printf("v_str[%d]: %q\t", i, v_str[i])
}
fmt.Println()
// 同时对多个局部变量进行赋值
for i, length := 0, len(v_str); i < length; i++ {
fmt.Printf("v_str[%d]: %q\t", i, v_str[i])
}
fmt.Println()
// 配合 range 使用
// 下面代码中 elem 是 v_str 中每个元素值的副本,在循环体内可以对其进行任意修改,不会影响到原字符串
for i, elem := range v_str {
elem = elem - 32
fmt.Printf("v_str[%d]: %q\t", i, elem)
}
fmt.Println("\nTest str: ", v_str)
// 只保留条件判断:
fmt.Println("Beginning 4 chars in v_str: ")
j := 0
for j < 4 {
fmt.Printf("v_str[%d]: %q\t", j, v_str[j])
j++
}
fmt.Println()
// 无条件判断限制的循环,需要在合适的时候从内部 break 或者 return,否则无限循环
count := 0
for {
if count >= 3 {
break
}
fmt.Printf("count: %d\n", count+1)
count++
}
v_IntArray := [...]int{1, 2, 3, 4, 5}
// 注意:如果 range 处理的是一个指针的数组,那么在循环体内通过指针修改其指向的对象是可以的。
// range 表达式处理数组,代码块中的改变不会影响到原始数组
for i, elem := range v_IntArray {
elem *= 100
fmt.Println(i, elem)
}
fmt.Println("After range []T", v_IntArray)
// range 表达式处理数组的指针,代码块中的改变也不会影响到原始数组
for i, elem := range &v_IntArray {
elem *= 100
fmt.Println(i, elem)
}
fmt.Println("After range *[]T", v_IntArray)
// range 表达式处理指针的数组,代码块中对指针指向内容的改变会改变原数组中指针指向的内容
v_Pointer2IntArray := [...]*int{&v_IntArray[0], &v_IntArray[1], &v_IntArray[2], &v_IntArray[3], &v_IntArray[4]}
for i, elem := range v_Pointer2IntArray {
*elem *= 100
fmt.Println(i, *elem)
}
fmt.Println("After range []*T, the values being pointed by pointers in v_Pointer2IntArray is:")
for _, elem := range v_Pointer2IntArray {
fmt.Printf("%d\t", *elem)
}
}
将上面的代码存入源文件 for.go 并使用 go run for.go
可以看到下面的输入:
Test str: post hoc
v_str[0]: 'p' v_str[1]: 'o' v_str[2]: 's' v_str[3]: 't'
v_str[0]: 'p' v_str[1]: 'o' v_str[2]: 's' v_str[3]: 't' v_str[4]: ' ' v_str[5]: 'h' v_str[6]: 'o' v_str[7]: 'c'
v_str[0]: 'P' v_str[1]: 'O' v_str[2]: 'S' v_str[3]: 'T' v_str[4]: '\x00' v_str[5]: 'H' v_str[6]: 'O' v_str[7]: 'C'
Test str: post hoc
Beginning 4 chars in v_str:
v_str[0]: 'p' v_str[1]: 'o' v_str[2]: 's' v_str[3]: 't'
count: 1
count: 2
count: 3
0 100
1 200
2 300
3 400
4 500
After range []T [1 2 3 4 5]
0 100
1 200
2 300
3 400
4 500
After range *[]T [1 2 3 4 5]
0 100
1 200
2 300
3 400
4 500
After range []*T, the values being pointed by pointers in v_Pointer2IntArray is:
100 200 300 400 500
需要注意的是:
for
可以和range
配合,在使用中类似于 C# 中的foreach
或者 Python 中的with
。for
配合range
使用时,会对数组元素进行值拷贝。如果range
处理的是一个指针的数组,那么在循环体内通过指针修改其指向的对象是可以的。- 关于
range
的详细讨论在 之四: map,range
IF-ELSE 语句
比较简单,看下面的实例就可以了:
package main
import "fmt"
func main() {
v_int := 9
if v_int < 10 {
fmt.Println("true")
}
// 可以省略条件判断的小括号
if v_int < 10 {
fmt.Println("true")
}
// 可以定义代码块作用域的局部变量
if temp := 9; v_int > 0 {
fmt.Printf("%d / %d = %d", temp, v_int, temp/v_int)
}
// 在进行条件判断前,可以执行一些初始化的操作,比如打印一些信息
// else 必须跟在上一个代码块花括号右半部分后面,否则会有编译错误
if fmt.Println("Checking number:"); v_int%2 == 0 {
fmt.Printf("%d is even number\n", v_int)
} else {
fmt.Printf("%d is odd number\n", v_int)
}
}
将上面的代码存入源文件 ifelse.go 并使用 go run ifelse.go
可以看到下面的输入:
true
true
9 / 9 = 1Checking number:
9 is odd number
需要注意的地方:
- 在条件判断语句前可以加入初始化语句。
else
必须跟在上个代码块结束的右半部分花括号后面,否则编译出错。,因为 Golang 编译器会在{
前面自动加;
。- 和
for
语句一样,代码块的左半部分花括号必须在条件判断语句同一行,因为 Golang 编译器会在{
前面自动加;
。
Switch 语句
package main
import "fmt"
func main() {
// 可以替代 if-else 语句
v_int := 73
switch {
case v_int < 100:
fmt.Println(v_int, "is less than 100")
case v_int >= 100:
fmt.Println(v_int, "is greater than or enqual to 100")
}
// 分支可以使用变量
v_intArr := []int{1, 2, 3}
v_int = 2
switch v_int {
case v_intArr[1]:
println("hello")
case len(v_intArr):
println("b")
default:
println("c")
}
// 使用 fallthrough 之后从执行下一个分支,而且不判断条件。注意 20 是偶数
v_int = 20
switch v_int {
case 20:
println(v_int, "is even, but:")
fallthrough
case 0:
fmt.Println(v_int, "is odd number")
}
}
将上面的代码存入源文件 switch.go 并使用 go run switch.go
可以看到下面的输入:
73 is less than 100
20 is odd number
hello
20 is even, but:
参考资料
- The Go Programming Language
- Go in Action 中文版
- The way to Go 中文版
- Go by Example
- Organizing Go code
- Testing Techniques
- Go 语言分享
- Go 学习笔记
- Go 语言简介
- Tony Bai 的博客
声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: Golang 语言基础之二: for, ifelse, switch
有疑问加站长微信联系(非本文作者)
