ZetCode

Golang default 关键字

最后修改于 2025 年 5 月 7 日

本教程解释了如何在 Go 中使用 default 关键字。我们将通过实际示例介绍 switch 语句基础知识以及 default 情况。

当没有其他情况匹配时,switch 语句中的 default 情况就会执行。它是可选的,但对于处理意外或 fall-through 值非常有用。

在 Go 中,default 可以出现在 switch 语句中的任何位置,尽管习惯上将其放在最后。它确保所有可能的值都得到处理。

基本的 default 情况

default 最简单的用法是在没有情况匹配时提供一个备用方案。本示例演示了其基本语法和行为。

basic_default.go
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 语句中使用整数值的情况。

numeric_default.go
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 来处理意外的类型。本示例演示了带备用方案的类型检查。

type_default.go
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 中的任何位置。本示例展示了位置如何影响执行流程。

position_default.go
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 情况的交互。

empty_default.go
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 来清晰地处理函数中不同状态码的错误处理。

error_default.go
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 链进行对比,以显示何时何种方法更可取。

default_vs_ifelse.go
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 更适合范围。

来源

Go 语言规范

本教程通过 switch 语句在各种场景下的 fallback 示例,涵盖了 Go 中的 default 关键字。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Golang 教程