Menu
CoddyTech

类型分支

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 18 课,共 68 课。

虽然类型断言适合检查单个类型,但你经常需要处理接口变量可能具有的多种类型。这时,类型 switch 就非常有用,它能让你根据具体类型清晰地执行不同操作。

类型 switch 使用这种特殊语法:switch v := i.(type)。注意这里使用的是 (type) 关键字,而不是某个具体类型。变量 v 在每个 case 中都会包含实际值及其具体类型:

func describe(data interface{}) {
    switch v := data.(type) {
    case int:
        fmt.Printf("Integer: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Boolean: %t\n", v)
    default:
        fmt.Printf("Unknown type: %T\n", v)
    }
}

在每种情况下,v 都会自动具有正确的类型,无需额外进行类型断言。这样,类型切换比用 if-else 语句串联多个类型断言简洁得多,尤其是在需要在同一处处理多种不同类型时。

challenge icon

挑战

简单

在这个挑战中,你将练习使用类型 switch 来处理通知系统中的多种数据类型。你将创建一个函数,根据通知的具体类型处理不同类型的通知,并对其进行相应格式化。

你会收到两个输入:

  • 表示通知类型的字符串(例如 "email"、"sms"、"push" 或 "alert")
  • 表示通知内容或值的字符串

你的任务是:

  1. 创建一个名为 processNotification 的函数,它接受一个 interface{} 参数
  2. 根据通知类型输入,将内容转换为合适的 Go 类型,并存储在一个 interface{} 变量中:
    • 对于 "email":将内容作为字符串使用
    • 对于 "sms":将内容转换为整数(表示字符数)
    • 对于 "push":将内容转换为布尔值(内容为 "enabled" 时为 true,其他情况为 false)
    • 对于 "alert":将内容转换为 float64(表示优先级)
  3. 将转换后的值传递给 processNotification 函数
  4. 在 processNotification 中,使用类型 switch 处理每种类型,并打印相应的消息:
    • 对于 string:"Email notification: [value]"
    • 对于 int:"SMS notification with [value] characters"
    • 对于 bool:"Push notifications: [value]"
    • 对于 float64:"Alert with priority: [value]"
    • 对于其他任何类型:"Unknown notification type"

使用 strconv 包进行字符串转换。转换为布尔值时,只有 "enabled" 应转换为 true。这个挑战会展示类型 switch 如何在一个控制结构中简洁地处理多种类型,并在每种情况下自动提供类型正确的值。

以最短形式打印 float64,就像 fmt.Println 或 %v / %g 格式动词那样:3.5 会打印为 3.5,1.0 会打印为 1(%f 格式动词会打印为 1.000000)。

亲手试试

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 读取输入
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: 在下方编写代码
	// 1. 创建接收 interface{} 参数的 processNotification 函数
	// 2. 根据 notificationType 将 content 转换为合适的类型
	// 3. 用转换后的值调用 processNotification
	// 4. 在 processNotification 中使用类型 switch 处理不同类型
	
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器