空接口
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 16 课,共 68 课。
到目前为止,你使用的接口都要求实现特定的方法,但 Go 有一种非常灵活的特殊接口:空接口,写作 interface{}。
空接口完全没有方法要求,这意味着 Go 中的任何类型都会自动满足它。由于每种类型至少都实现了 0 个方法,因此任何类型都可以赋值给 interface{} 变量:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // 切片当你需要处理类型未知或不固定的数据时,interface{} 会非常有用。在读取配置文件、处理用户输入,或使用会根据情况返回不同数据类型的 API 时,你可能会遇到这种情况。
不过,由于空接口可以容纳任何类型,通常需要先确定其中实际存储的类型,才能有意义地使用这个值。这时,类型断言和类型 switch(你接下来会学到)就成了安全处理 interface{} 值的重要工具。
挑战
简单在这个挑战中,你将练习使用空接口,创建一个可以处理不同类型值的数据处理器。你将创建一个接受 interface{} 参数并处理各种数据类型的函数。
你将收到两个输入:
- 一个表示数据类型的字符串(例如,
"int"、"string"、"bool"或"slice") - 一个表示实际值的字符串(例如,
"42"、"hello"、"true"或"1,2,3")
你的任务是:
- 创建一个名为
processData的函数,它接受一个interface{}参数,并打印有关该值的信息 - 根据输入的数据类型,将值字符串转换为相应的 Go 类型:
- 对于
"int":转换为整数 - 对于
"string":直接使用字符串 - 对于
"bool":转换为布尔值 - 对于
"slice":将逗号分隔的值转换为整数切片
- 对于
- 使用转换后的值调用
processData函数 - 在
processData中,按照以下格式打印值及其类型:"Value: [value], Type: [type]"
对于切片输入,应将类似 "1,2,3" 的逗号分隔字符串转换为 []int{1, 2, 3}。由于该函数接受 interface{},因此可以处理任何类型,这展示了空接口可以保存任意类型的值。使用 fmt.Printf 和 %v、%T 格式动词,分别显示值和类型。
亲手试试
package main
import (
"fmt"
)
func main() {
// 读取输入
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO:在下方编写代码
// 1. 创建接受 interface{} 类型参数的 processData 函数
// 2. 根据 dataType 将 valueStr 转换为相应的类型
// 3. 用转换后的值调用 processData
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器