美文网首页Golang进阶
实现多个接口的类型,在类型断言时的行为

实现多个接口的类型,在类型断言时的行为

作者: qishuai | 来源:发表于2021-12-09 19:00 被阅读0次

先上代码:

package main

import (
    "fmt"
)

type A interface {
    FuncA()
}

type B interface {
    FuncB()
}

type T int

func (t T) FuncB() {}

func (t T) FuncA() {}

func main() {
    var v T
    fmt.Println(typeOf(v))
    fmt.Println(typeOf(A(v)))
    fmt.Println(typeOf(B(v)))

    var a A = v
    var b A = v
    fmt.Println(typeOf(a))
    fmt.Println(typeOf(b))
}

func typeOf(v interface{}) string {
    switch v.(type) {
    case T:
        return "T"
    case A:
        return "A"
    case B:
        return "B"
    default:
        return "unknown"
    }
}

类型T,底层数据为int类型(类型T并非int的类型别名,注意区分type T = int),其同时实现了接口A和接口B。上面的代码运行时,结果如下:

T
T
T
T

但是我稍微改动一下switch...case的代码后,结果发生了变化:

...
    switch v.(type) {
    // case T:
    //  return "T"
    case A:
        return "A"
    case B:
        return "B"
    default:
        return "unknown"
    }
...

// output:
A
A
A
A

同理如果注释掉case A代码段后,输出的都是B。这里可以得出一个结论,如果类型断言时,如果被断言的数据同时符合多个case分支时,只会命中第一个符合的case分支。

原理解析:
通过汇编可以发现,在执行case 语句时会调用runtime.assertE2I2函数:

image.png
然后就是看源码了。。。
对源码有兴趣的话,可以移步这个视频:https://www.bilibili.com/video/BV1hv411x7we?p=14

相关文章

  • 实现多个接口的类型,在类型断言时的行为

    先上代码: 类型T,底层数据为int类型(类型T并非int的类型别名,注意区分type T = int),其同时实...

  • 11 | 接口

    接口是用来定义行为的类型。这些被定义的行为不由接口直接实现,而是通过方法由用户自定义类型实现 断言 如果转换合法,...

  • 随笔37号20181023-go断言

    类型断言 类型断言用于提取接口的底层值(Underlying Value)。 在语法i.(T)中,接口i的具体类型...

  • golang interface

    interface 类型断言 interface的变量里面可以存储任意类型类型数据(原理: 任何类型都实现了空接口...

  • 1-类型断言

    类型断言适用对象 类型断言只能用于interface变量。 未实现相应接口的方法的断言,编译会失败 int32没有...

  • Java笔试题解-枚举类型(2)

    1: A.枚举类型也可以实现一个或多个接口 B.枚举类型实现接口时也要实现该接口中全部方法 C.枚举类型里定义抽象...

  • 聊聊golang的类型断言

    序 本文主要研究一下golang的类型断言 类型断言 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x...

  • go类型断言

    1.类型断言就是将接口类型的值(x),转换成类型(T)。格式为:x.(T);2.类型断言的必要条件就是x是接口类型...

  • golang 类型断言

    golang类型断言 类型断言是一个使用在接口值上的操作 有时候,我们可能需要知道某个接口类型的实际类型,比如某个...

  • go 接口

    空接口 断言 我们知道interface{}可以保存任意类型的数,所以我们要通过断言查询是什么类型断言的对象是空接口

网友评论

    本文标题:实现多个接口的类型,在类型断言时的行为

    本文链接:https://www.haomeiwen.com/subject/kzeffrtx.html