Contents

golang-学习笔记-控制结构

go官方文档 go语言参考

在写过很多go代码之后,感觉自己并没有完全掌握go语言,还有很多知识盲区,所以有了这个go学习笔记系列,本系列是作者跟着电子书重新复习go语言相关内容的笔记

if-else 结构

1
2
3
4
5
6
7
if condition1 {
    // do something    
} else if condition2 {
    // do something else    
}else {
    // catch-all or default
}
1
2
3
if initialization; condition {
    // do something
}

switch 结构

1
2
3
4
5
6
7
8
switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

不需要特别使用 break 语句来表示结束。

如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的。

当代码块只有一行时,可以直接放置在 case 语句之后

for 结构

基于计数器的迭代

1
for 初始化语句; 条件语句; 修饰语句 {}

基于条件判断的迭代

1
for 条件语句 {}

无限循环

1
2
3
for { }

for true { }

for-range 结构

1
for ix, val := range coll { }

coll会进行值拷贝然后遍历拷贝数组的索引ix和值val,所以下面的代码会输出不符合常理的结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

func main() {
	arr := [3]int{1, 2, 3}
	for i, v := range arr {
		if i == 0 {
			arr[1] = 100
		}
		fmt.Println(i, v)
	}
}
/*输出
0 1
1 2
2 3
而不是
0 1
1 100
2 3
*/

一种解决办法是对于数组使用切片重组来避免数组拷贝

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
	arr := [3]int{1, 2, 3}
	for i, v := range arr[:] {
		if i == 0 {
			arr[1] = 100
		}
		fmt.Println(i, v)
	}
}
/*输出
0 1
1 100
2 3
*/

val 始终为集合中对应索引的值拷贝,如果 val 为指针,则会产生指针的拷贝,依旧可以修改集合中的原值

一个字符串是 Unicode 编码的字符(或称之为 rune)(4字节)集合,字符串中对存储进行了优化常用英文字符使用 1 个字节表示,而汉字(译者注:严格来说,“Chinese: 日本語”的Chinese应该是Japanese)使用 3 个字符表示。因此您也可以用它迭代字符串,迭代的char为4字节:

1
2
3
for pos, char := range str {
...
}

for range结构可以选择从左往右要接收几个值,甚至可以不接受值,但是如果要只接收后面的值,那么必须用_忽略前面的值

Break 与 continue

break跳出最近的循环,另外该指令能跳出switch或select代码块

continue跳过剩余的循环体,不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件

标签与 goto

某一行第一个以冒号(:)结尾的单词

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {

LABEL1:
    for i := 0; i <= 5; i++ {
        for j := 0; j <= 5; j++ {
            if j == 4 {
                continue LABEL1
            }
            fmt.Printf("i is: %d, and j is: %d\n", i, j)
        }
    }

}

特别注意 使用标签和 goto 语句是不被鼓励的

 |