package main
import (
"fmt"
)
type MyStruct struct {
Name string
}
func main() {
var data []interface{}
data = append(data, 10)
data = append(data, "hello")
data = append(data, MyStruct{Name: "example"})
for _, item := range data {
switch v := item.(type) {
case int:
fmt.Printf("Type: int, Value: %d\n", v)
case string:
fmt.Printf("Type: string, Value: %s\n", v)
case MyStruct:
fmt.Printf("Type: MyStruct, Value: %+v\n", v)
default:
fmt.Printf("Unknown type\n")
}
}
}
边界情况及处理
- 类型断言失败:如果在
switch v := item.(type)
语句中没有涵盖所有可能的类型,在运行时访问未处理类型时,default
分支会被执行,打印Unknown type
。为避免这种情况,需要尽可能全面地列出可能的类型。
- 结构体内部的空接口类型:如果结构体内部存在空接口类型字段,在处理时可能需要递归处理。可以通过递归函数来处理结构体的各个字段。
- 性能问题:使用空接口和类型断言会带来一定的性能开销。在性能敏感的场景下,应尽量避免频繁使用这种方式,或者通过缓存类型断言的结果等方式优化性能。