使用类型断言遍历切片
package main
import (
"fmt"
)
// 定义一个接口
type Printer interface {
Print()
}
// 定义一个结构体并实现Printer接口
type MyStruct struct {
Value string
}
func (m MyStruct) Print() {
fmt.Println("MyStruct: ", m.Value)
}
func main() {
var data []interface{}
data = append(data, 10, "hello", MyStruct{Value: "world"})
for _, item := range data {
if printer, ok := item.(Printer); ok {
printer.Print()
}
}
}
使用类型开关遍历切片
package main
import (
"fmt"
)
// 定义一个接口
type Printer interface {
Print()
}
// 定义一个结构体并实现Printer接口
type MyStruct struct {
Value string
}
func (m MyStruct) Print() {
fmt.Println("MyStruct: ", m.Value)
}
func main() {
var data []interface{}
data = append(data, 10, "hello", MyStruct{Value: "world"})
for _, item := range data {
switch v := item.(type) {
case Printer:
v.Print()
}
}
}
特点和适用场景
- 类型断言:
- 特点:直接尝试将接口值断言为特定类型,如果断言成功则可以直接使用该类型的方法。代码相对简洁,对于明确知道可能出现的类型且逻辑较为简单的场景很适用。
- 适用场景:当你确切知道接口可能包含的具体类型,并且只需要处理一两种特定类型时,类型断言更为直接和高效。例如,在一个已知只包含
int
和MyStruct
类型且MyStruct
实现了特定接口的切片中,使用类型断言来处理MyStruct
的方法调用。
- 类型开关:
- 特点:可以同时处理多种类型,代码结构清晰,通过
switch
语句的分支来处理不同类型的逻辑。在处理多种类型时,代码可读性更好,更易于维护。
- 适用场景:当接口可能包含多种不同类型,并且需要针对每种类型执行不同的逻辑时,类型开关更为合适。例如,在一个通用的处理函数中,接口切片可能包含多种自定义类型,每种类型都有不同的接口实现,使用类型开关可以清晰地针对不同类型进行处理。