Golang default 关键字
最后修改于 2025 年 5 月 7 日
本教程解释了如何在 Go 中使用 default 关键字。我们将通过实际示例介绍 switch 语句基础知识以及 default 情况。
当没有其他情况匹配时,switch 语句中的 default 情况就会执行。它是可选的,但对于处理意外或 fall-through 值非常有用。
在 Go 中,default 可以出现在 switch 语句中的任何位置,尽管习惯上将其放在最后。它确保所有可能的值都得到处理。
基本的 default 情况
default 最简单的用法是在没有情况匹配时提供一个备用方案。本示例演示了其基本语法和行为。
package main
import "fmt"
func main() {
day := "Tuesday"
switch day {
case "Monday":
fmt.Println("Start of work week")
case "Friday":
fmt.Println("Almost weekend")
default:
fmt.Println("Midweek day")
}
}
由于“Tuesday”不匹配任何情况,因此会执行 default 块。输出将是“Midweek day”。
带数字值的 default
default 可与所有类型一起使用。本示例展示了其在 switch 语句中使用整数值的情况。
package main
import "fmt"
func main() {
age := 42
switch {
case age < 18:
fmt.Println("Minor")
case age >= 18 && age < 65:
fmt.Println("Adult")
default:
fmt.Println("Senior")
}
}
switch 会评估条件而不是值。由于 42 匹配第二个情况,因此 default 在此处不执行。
类型 switch 中的 default
类型 switch 可以使用 default 来处理意外的类型。本示例演示了带备用方案的类型检查。
package main
import "fmt"
func checkType(x interface{}) {
switch x.(type) {
case int:
fmt.Println("Integer")
case string:
fmt.Println("String")
case bool:
fmt.Println("Boolean")
default:
fmt.Println("Unknown type")
}
}
func main() {
checkType(42)
checkType("hello")
checkType(3.14)
}
default 情况会捕获 float64 值 (3.14),因为它没有被显式处理。它会为该输入打印“Unknown type”。
Default 的位置很重要
default 可以出现在 switch 中的任何位置。本示例展示了位置如何影响执行流程。
package main
import "fmt"
func main() {
value := 3
switch value {
default:
fmt.Println("Default case first")
case 1:
fmt.Println("One")
case 2:
fmt.Println("Two")
case 3:
fmt.Println("Three")
}
}
尽管 default 出现在前面,Go 仍然按顺序评估情况。匹配的情况 (3) 会执行,表明位置不影响逻辑。
带空情况的 default
空情况会 fall through 到 default。本示例演示了空情况与 default 情况的交互。
package main
import "fmt"
func main() {
letter := 'b'
switch letter {
case 'a', 'e', 'i', 'o', 'u':
fmt.Println("Vowel")
case ' ':
// Empty case falls through
default:
fmt.Println("Consonant or other")
}
}
空格字符匹配一个空情况,导致执行 fall through 到 default。对于 'b',输出将是“Consonant or other”。
实际示例:错误处理
这个实际示例使用 default 来清晰地处理函数中不同状态码的错误处理。
package main
import "fmt"
func handleStatus(code int) string {
switch code {
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Internal Server Error"
default:
return fmt.Sprintf("Unknown status: %d", code)
}
}
func main() {
fmt.Println(handleStatus(200))
fmt.Println(handleStatus(403))
}
default 情况可以优雅地处理意外的状态码,如 403,返回一个描述性消息而不是失败。
Default 与 if-else 对比
本示例将 default 与传统的 if-else 链进行对比,以显示何时何种方法更可取。
package main
import "fmt"
func main() {
// Switch with default
fruit := "dragonfruit"
switch fruit {
case "apple", "pear":
fmt.Println("Common fruit")
case "durian":
fmt.Println("Exotic fruit")
default:
fmt.Println("Unknown fruit")
}
// Equivalent if-else
if fruit == "apple" || fruit == "pear" {
fmt.Println("Common fruit")
} else if fruit == "durian" {
fmt.Println("Exotic fruit")
} else {
fmt.Println("Unknown fruit")
}
}
两种方法都产生相同的输出。带有 default 的 Switch 对于多个离散值更简洁,而 if-else 更适合范围。
来源
本教程通过 switch 语句在各种场景下的 fallback 示例,涵盖了 Go 中的 default 关键字。