断言类型的两种情况。
语法形式: x.(T)
第1种,断言的类型T是一个具体的类型。类型断言检查x的动态类型是否和T相同。如果这个检查成功了,类型断言
的结果是x的动态值,当然它的类型是T。换句话说,具体类型的类型断言从它的操作对象种获取具体的值。如果失败,抛出panic。
package main
import (
"fmt"
"io"
"os"
)
func main() {
var w io.Writer
w = os.Stdout
f := w.(*os.File)
fmt.Printf("f=%v,f=%T\n", f, f)
fmt.Printf("w=%v,w=%T\n", w, w)
}
运行结果:
f=&{0x10aaa240},f=*os.File
w=&{0x10aaa240},w=*os.File
成功: 进程退出代码 0.
第2种,如果断言的类型T是一个接口类型,然后类型断言检查是否x的动态类型满足T。如果检查成功,动态值没有获取到;
这个结果仍然是一个有相同类型和值部分的接口值,但是结果有类型T。
package main
import (
"fmt"
"io"
"os"
)
func main() {
var w io.Writer
fmt.Printf("w=%v,w=%T\n", w, w)
w = os.Stdout
rw := w.(io.ReadWriter)
fmt.Printf("rw=%v,rw=%T\n", rw, rw)
fmt.Printf("w=%v,w=%T\n", w, w)
}
运行结果:
w=<nil>,w=<nil>
rw=&{0x10c06240},rw=*os.File
w=&{0x10c06240},w=*os.File
成功: 进程退出代码 0.