面试题答案
一键面试代码示例
package main
import (
"fmt"
"io"
)
func main() {
var data interface{} = &strings.Reader{"Hello, World!"}
reader, ok := data.(io.Reader)
if!ok {
fmt.Println("类型断言失败")
return
}
buf := make([]byte, 1024)
n, err := reader.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("读取数据错误:", err)
return
}
fmt.Println("读取到的数据:", string(buf[:n]))
}
类型断言工作原理
在Go语言的静态类型体系下,每个接口值都有一个动态类型(实际存储的具体类型)和动态值(实际存储的数据)。类型断言 x.(T)
用于检查接口值 x
的动态类型是否为 T
。如果是,断言成功,返回动态值并将其转换为类型 T
;如果不是,断言失败。
可能出现的错误情况
- 运行时错误:如果接口值
x
为nil
,使用x.(T)
会导致运行时恐慌(panic),因为nil
接口值没有动态类型。 - 类型不匹配错误:如果接口值
x
的动态类型不是T
,使用x.(T)
会返回一个零值(对于非空接口值),并且第二个返回值(用于判断断言是否成功的布尔值)为false
。在使用这种形式的断言时,必须检查第二个返回值,以避免使用错误类型转换后的值。例如:
var i interface{} = "hello"
r, ok := i.(io.Reader)
if!ok {
// 处理类型不匹配的情况
}