类型断言表达式
- 语法:
x.(T)
,其中x
是一个接口类型的变量,T
是目标类型。如果x
实际指向的类型是T
,则断言成功,返回T
类型的值和一个布尔值true
;如果断言失败,返回目标类型的零值和false
。
- 示例:
package main
import (
"fmt"
)
func main() {
var i interface{} = "hello"
s, ok := i.(string)
if ok {
fmt.Printf("It's a string: %s\n", s)
} else {
fmt.Println("It's not a string")
}
}
- 应用场景:当你明确知道接口可能指向的几种类型,并且每次只需要判断一种类型时,使用类型断言表达式较为合适。例如在一个函数中,该函数接收一个接口类型参数,你希望判断它是否为某一特定类型并进行相应处理。
类型选择语句
- 语法:
switch v := x.(type) {}
,其中x
是接口类型的变量,v
是在switch
分支中定义的新变量,其类型由type
关键字根据x
实际指向的类型自动推导。
- 示例:
package main
import (
"fmt"
)
func main() {
var data []interface{}
data = append(data, 10, "world", 3.14)
for _, v := range data {
switch value := v.(type) {
case int:
fmt.Printf("It's an int: %d\n", value)
case string:
fmt.Printf("It's a string: %s\n", value)
case float64:
fmt.Printf("It's a float64: %f\n", value)
default:
fmt.Println("Unsupported type")
}
}
}
- 应用场景:当接口可能包含多种不同类型的值,且你需要对每种类型都进行不同处理时,类型选择语句更为方便。例如处理一个包含多种类型值的接口切片,通过类型选择可以简洁地对不同类型的值进行相应操作。