介绍
在 Go 语言中,类型断言是一种将一种接口类型转换为另一种类型的技术,它是通过这条语法实现的:i.(Type),其中 i 是一个接口变量,Type 是我们想要转换到的目标类型。如果转换成功,类型断言表达式的结果将是转换后的值。否则,表达式将会抛出 panic。
示例一:理解类型断言基本语法
```
package main
import (
"fmt"
)
func main() {
var i interface{} = "hello world"
s := i.(string)
fmt.Println(s)
}
```
这是一个简单的类型断言示例,结果为hello world。首先,我们创建了一个空接口 (interface{}) 变量 i,将 "hello world" 赋值给它。接下来,我们使用 s := i.(string) 将 i 转换为字符串类型并将其赋值给 s。由于 i 确实是字符串类型,类型断言成功,s 将打印出 "hello world"。
示例二:类型断言失败时处理
```
package main
import (
"fmt"
)
func main() {
var i interface{} = 42
s, ok := i.(string)
if ok {
fmt.Printf("%q is a string\n", s)
} else {
fmt.Printf("could not convert %v to a string\n", i)
}
}
```
在这个例子中,我们尝试将整数 i 转换成字符串类型。由于这是一种无效的类型转换,类型断言将失败。为了检测到这个失败,我们使用了类型断言的 “comma, ok” 形式,它返回两个值。第一个值是 i 转换成字符串类型后的值,如果转换成功,第二个值将是 true。否则,第二个值将是 false。如果 ok 是 false,我们手动处理转换失败这个事件。
示例三:向函数传递接口变量并进行类型断言
```
package main
import (
"fmt"
)
func printString(s interface{}) {
str, ok := s.(string)
if ok {
fmt.Printf("%q is a string\n", str)
} else {
fmt.Printf("%v is not a string\n", s)
}
}
func main() {
printString("hello world")
printString(42)
}
```
这个例子展示了如何将一个接口变量 (interface{}) 传递给函数,并使用类型断言将其转换成较具体的类型。我们定义了一个名为 printString 的函数,它接收一个接口变量 s。在函数的实现中,我们试图将 s 转换成一个字符串类型。如果转换成功,我们将打印出 "s is a string",否则将打印出 "s is not a string"。最后,我们在主函数中调用 printString 函数两次,分别将字符串和整数作为参数传递给它,来验证它是否正确工作。