1.if-else结构
if condition1 {// do something} else if condition2 {// do something else}else {// catch-all or default}
1)判断一个字符串是否为空:
- if str == “” { … }
- if len(str) == 0 {…}
2)判断运行 Go 程序的操作系统类型,这可以通过常量 runtime.GOOS 来判断。
if runtime.GOOS == "windows" {. ..} else { // Unix-like. ..}
3)if 可以包含一个初始化语句
if initialization; condition {// do something}
2.测试多返回值函数的错误
Go 语言的函数经常使用两个返回值来表示执行是否成功:返回某个值以及 true 表示成功;返回零值(或 nil)和 false 表示失败
an, err := strconv.Atoi(orig)if err != nil {fmt.Printf("orig %s is not an integer - exiting with error\n", orig)return}
这是测试 err 变量是否包含一个真正的错误(if err != nil)的习惯用法。如果确实存在错误,则会打印相应的错误信息然后通过 return 提前结束函数的执行。我们还可以使用携带返回值的 return 形式,例如 return err
value, err := pack1.Function1(param1)if err != nil {fmt.Printf("An error occured in pack1.Function1 with parameter %v", param1)return err}// 未发生错误,继续执行:
在main函数我们想要在错误发生的同时终止程序的运行,我们可以使用 os 包的 Exit 函数
if err != nil {fmt.Printf("Program stopping with error %v", err)os.Exit(1)}
可以将错误的获取放置在 if 语句的初始化部分
if err := file.Chmod(0664); err != nil {fmt.Println(err)return err}
或者将 ok-pattern 的获取放置在 if 语句的初始化部分,然后进行判断
if value, ok := readData(); ok {…}
3.switch结构
switch var1 {case val1:...case val2:...default:...}
1)变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式
2)可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。
3)变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式
4)如果在执行完每个分支的代码后,还希望继续执行后续分支的代码,可以使用 fallthrough 关键字来达到目的
switch i {case 0: // 空分支,只有当 i == 0 时才会进入分支case 1:f() // 当 i == 0 时函数不会被调用}
switch i {case 0: fallthroughcase 1:f() // 当 i == 0 时函数也会被调用}
5)switch 语句的第二种形式是不提供任何被判断的值(实际上默认为判断是否为 true),然后在每个 case 分支中进行测试不同的条件。当任一分支的测试结果为 true 时,该分支的代码会被执行。
switch {case condition1:...case condition2:...default:...}
package mainimport "fmt"func main() {var num1 int = 7switch {case num1 < 0:fmt.Println("Number is negative")case num1 > 0 && num1 < 10:fmt.Println("Number is between 0 and 10")default:fmt.Println("Number is 10 or greater")}}
6)switch 语句的第三种形式是包含一个初始化语句
switch initialization {case val1:...case val2:...default:...}
switch a, b := x[i], y[j]; {case a < b: t = -1case a == b: t = 0case a > b: t = 1}
4.for结构
1)形式1:for 初始化语句; 条件语句; 修饰语句 {}
2)形式2:for 条件语句 {}
3)形式3:(无限循环)for { }
4)形式4:(for-range结构)for ix, val := range coll { }
练习:写一个从 1 打印到 100 的程序,但是每当遇到 3 的倍数时,不打印相应的数字,但打印一次 “Fizz”。遇到 5 的倍数时,打印 Buzz 而不是相应的数字。对于同时为 3 和 5 的倍数的数,打印 FizzBuzz(提示:使用 switch 语句)。
package mainimport "fmt"func main() {for i := 1; i <= 100; i++ {switch a, b := i % 3, i % 5; {case a == 0 :fmt.Print("Fizz")if b == 0 {fmt.Print("Buzz")}case b == 0 : fmt.Print("Buzz");default : fmt.Print(i)}fmt.Println()}}
5. Break 与 continue
一个 break 的作用范围为该语句出现后的最内部的结构,它可以被用于任何形式的 for 循环(计数器、条件判断等)。但在 switch 或 select 语句中(详见第 13 章),break 语句的作用结果是跳过整个代码块,执行后续的代码。
关键字 continue 忽略剩余的循环体而直接进入下一次循环的过程,但不是无条件执行下一次循环,执行之前依旧需要满足循环的判断条件。
6.标签与 goto
使用标签和 goto 语句是不被鼓励的(有需要时再来了解)
