if/else

Go 中的 if/else 语句和其他编程语言中 ​​if/else​​ 规则一致,除了语法上略有差异。

语法规则

​if​​ 和 ​​else if​​ 后面的条件表达式是不需要括号的。

单个 if

if condition {
// do something
}

例子

package main

func main() {
n := 1024
if n > 0 {
println("n > 0")
}
}

// $ go run main.go
// 输出如下
/**
n > 0
*/

单个 if/else

if condition {
// do something
} else {
// do something else
}

例子

package main

func main() {
n := 1024
if n > 0 {
println("n > 0")
} else {
println("n <= 0")
}
}

// $ go run main.go
// 输出如下
/**
n > 0
*/

多个分支

if condition1 {
// do something
} else if condition2 {
// do something else
} else {
// default
}

例子

package main

func main() {
n := 0
if n > 0 {
println("n > 0")
} else if n < 0 {
println("n < 0")
} else {
println("n = 0")
}
}

// $ go run main.go
// 输出如下
/**
n == 0
*/


switch

相较于主流编程语言,Go 中的 ​​switch​​ 语法更加灵活,它接受任意形式的表达式。

语法规则

  • • ​​switch​​ 后面的表达式不需要括号
  • • ​​case​​ 语句块执行完会自动退出整个 ​​switch​​ 语句块,也就是不需要使用 ​​break​​ 显式声明
  • • ​​case​​ 语句快执行完后,如果希望继续向下执行,可以使用关键字 ​​fallthrough​​, 这样就和其他编程语言不加 ​​break​​ 效果一样了
switch expr {   // expr 可以是任意类型
case v1:
...
case v2:
...
case v3:
...
case v4, v5, v6: // 可以同时测试多个可能符合条件的值
...
default: // 默认值
...
}

例子

普通表达式

package main

import "fmt"

func main() {
n := 1024
switch n {
case 1023:
fmt.Println("n = 1023")
case 1024:
fmt.Println("n = 1024")
case 1025:
fmt.Println("n = 1025")
}
}

// $ go run main.go
// 输出如下
/**
n = 1024
*/

运算表达式

package main

import "fmt"

func main() {
n := 1024
switch n * 2 {
case 1024:
fmt.Println("n = 1024")
case 2048:
fmt.Println("n = 2048")
case 0:
fmt.Println("n = 0")
}
}

// $ go run main.go
// 输出如下
/**
n = 2048
*/

default

package main

import "fmt"

func main() {
n := 1024
switch n * 2 {
case 0:
fmt.Println("n = 0")
case 1:
fmt.Println("n = 1")
case 2:
fmt.Println("n = 2")
default:
fmt.Println("n = 2048")
}
}

// $ go run main.go
// 输出如下
/**
n = 2048
*/

省略 expr 表达式

package main

import "fmt"

func main() {
n := 1024
switch {
case n < 1024:
fmt.Println("n < 1024")
case n > 1024:
fmt.Println("n > 1024")
case n == 1024:
fmt.Println("n == 1024")
default:
fmt.Println("invalid n")
}
}

// $ go run main.go
// 输出如下
/**
n = 1024
*/

同时测试多个 case

package main

import "fmt"

func main() {
n := 1024
switch n {
case 1023, 1024: // 多个 case, 只要一个匹配就 OK
fmt.Println("n <= 1024")
case 1025:
fmt.Println("n > 1024")
default:
fmt.Println("invalid n")
}
}

// $ go run main.go
// 输出如下
/**
n <= 1024
*/

fallthrough

package main

import "fmt"

func main() {
n := 1024
switch {
case n < 1024:
fmt.Println("n < 1024")
fallthrough // 继续向下执行
case n > 1024:
fmt.Println("n > 1024")
fallthrough // 继续向下执行
case n == 1024:
fmt.Println("n == 1024")
fallthrough // 继续向下执行
default:
fmt.Println("invalid n")
}
}

// $ go run main.go
// 输出如下
/**
n = 1024
invalid n
*/

类型断言

​switch​​​ 可以 ​​.(type)​​ 来实现类型断言,判断某个值是否为某个数据类型。

package main

func main() {
var n interface{} // 值必须为 interface 类型
n = 1024

switch n.(type) {
case nil:
println("n is a nil")
case int:
println("n is a integer")
case float64:
println("n is a float64")
case bool:
println("n is a bool")
case string:
println("n is a string")
default:
println("n is invalid")
}
}

// $ go run main.go
// 输出如下
/**
n is a integer
*/

关于上面代码注释中提到的 ​​interface​​, 后面会讲到, 读者这里只需知道关键字 ​​interface​​ 代表接口类型即可。


Go 快速入门指南 - if/else 和 switch_Go