当前位置: 代码迷 >> 综合 >> golang-类型断言
  详细解决方案

golang-类型断言

热度:107   发布时间:2023-10-13 09:10:59.0
//断言 检查x的动态类型是否是T,其中x必须是接口值
x.(T)

因为是检查x的动态类型,所以x必须是接口.

  1. 如果T是具体类型
var x interfence{
    }
x=100
i:=x.(int)//ok
package main
import "fmt"
type T interface {
    getName()string
}
type P struct {
    name string
}
func (p P)getName() string {
    return p.name
}
func main() {
    var t T//接口类型t = P{
    "aaa"}if f, ok1 := t.(P);ok1 {
    fmt.Printf("%T\n%s\n",f,f.getName())}
}
  1. 如果T是接口类型
package mainimport "fmt"type T interface {
    getName()string
}
type T2 interface {
    printName()
}
type P struct {
    name string
}
func (p P)getName() string {
    return p.name
}
func (p P) printName() {
    fmt.Println(p.name)
}
func main() {
    var t Tt = P{
    "aa"}if t, ok1 := t.(T2);ok1 {
    t.printName()}
}

原因:t, ok1 := t.(T2)返回ok的原因是P时接口T2的方法printName()的接受者。若printName()的接受者不是P,则返回true。
类型断言检查x的动态类型是否满足T。如果检查成功,x的动态值不会被提取,返回值是一个类型为T的接口值(j接口方法的接受者)。