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

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 代表接口类型即可。

联系我

公众号

posted @ 2022-12-22 16:21  洋芋土豆  阅读(97)  评论(0编辑  收藏  举报