首页 > 编程笔记

Go语言类型断言的用法

Go语言中使用类型断言(type assertions)将接口转换成另一个接口,也可以将接口转换为另外的类型。

接口类型断言的语法格式如下:
i.(T)

类型断言有如下两种含义:

类型断言的语法

类型断言的语法有下面两种。

1) 直接赋值模式

语法格式为:
t := i.(T)

例如:
package main
import " fmt"
type Inter interface {
    Ping ()
    Pang()
}
type Anter interface {
    Inter
    String()
}
type St struct{
    Name string
}
func (St) Ping() {
    println ("ping")
}
func (*St) Pang() {
    println ("pang")
}
func main() {
    st := &St{"andes"}
    var i interface{}= st
    //判断绑定的实例是否实现了接口类型Inter
    t := i.(Inter)
    t. Ping()
    t.Pang()
    //如下语句会引发panic,因为i没有实现接口Anter
    //p :=i. (Anter)
    //p. String ()
    //判断i绑定的实例是否就是具体类型St
    s :=i. (*St)
    fmt.Printf ("%s", s.Name)
}

2) comma,ok表达式模式

语法格式如下:
if t, ok := i.(T); ok{
}

例如:
package main
import "fmt"
type Inter interface {
    Ping ()
    Pang ()
}
type Anter interface {
    Inter
    String()
}
type St struct {
    Name string
}
func (St) Ping() {
    println ("ping")
}
func (*St) Pang() {
    println ("pang")
}
func main() {
    st := &St{ "andes"}
    var i interface{} = st
    //判断i绑定的实例是否实现了接口类型Inter
    if t, ok:= i. (Inter) ; ok{
        t.Ping()   //ping
        t. Pang()  //pang
    }
    if p, ok := i. (Anter); ok {
        //i没有实现接口Anter,所以程序不会执行到这里
        p.String ()
    }
    //判断i绑定的实例是否就是具体类型st
    if s, ok := i.(*St);ok {
        fmt.Printf("%s", s.Name)    //andes
    }
}
运行结果如下:

ping
pang
andes

推荐阅读