为什么在golang的以下代码示例中switch匹配其他类型

伊万:

链接:https//play.golang.org/p/69I8PAuoAV

提取:

package main

import "fmt"

type Stringer interface {
    String() string
}

type fakeString struct {
    content string
}

// function used to implement the Stringer interface
func (s *fakeString) String() string {
    return s.content
}

func printString(value interface{}) {
    switch str := value.(type) {
    case string:
        fmt.Println(str)
    case Stringer:
        fmt.Println(str.String())
    }
}

func main() {
    s := &fakeString{"Ceci n'est pas un string"}
    printString(s)
    printString("Hello, Gophers")

}

printString(s)到达大小写匹配case Stringer部分函数调用s的类型*fakeString不是Stringer为什么匹配Stringer

我做了一个fmt.Println(reflect.TypeOf(str)),它确认类型为*main.fakeString

cizixs:

这是golang中的界面满意度

golang中有两种类型:接口类型具体类型

  • concrete type完全按照您的预期工作switch:变量是给定类型的实例
  • interface type另一方面,它的工作方式不同,它检查变量是否满足接口要求。

哼,满足吗?它是如何工作的?

如果(具体)类型拥有接口所需的所有方法,则它可以满足该接口。

-golang编程语言

在这种情况下,Stringer是一个接口,仅声明一种方法:String() stringfakeString通过自己的String() string方法来满足它

但是,需要注意两件事:

  1. 具体类型可以有许多其他方法,但如果它拥有在接口中声明的所有方法,它仍然可以满足该接口
  2. 方法顺序无关紧要,重要的是方法集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么以下代码会转换为Java字节码中的新+ dup op指令?

来自分类Java

为什么以下代码自动装箱到错误的类型并进行编译?

来自分类Dev

为什么在以下带有defer的golang代码示例中得到0和1

来自分类Dev

为什么警报框在以下代码中不断触发?

来自分类Dev

为什么以下代码在C ++中是非法的

来自分类Dev

为什么以下代码段可以加快代码速度?

来自分类Dev

当其他成员设置为新值时,C联合成员将给出特定/错误值。为什么在C中的以下代码中输出此结果?

来自分类Dev

以下代码在cpython中做什么

来自分类Dev

以下代码段的输出是什么,为什么?

来自分类Dev

以下代码中“ *&”的用法是什么

来自分类Dev

Java类型清除:为什么以下代码段无法编译?

来自分类Dev

以下代码的输出是什么,为什么?

来自分类Dev

以下代码在C中做什么?

来自分类Dev

为什么以下代码会运行?

来自分类Dev

为什么在以下代码中无法投射类型为'WhereSelectEnumerableIterator的对象?

来自分类Dev

以下代码中\ +的含义是什么

来自分类Dev

为什么在以下代码中得到NullPointerException?

来自分类Dev

为什么以下代码无法编译?

来自分类Dev

为什么在以下代码中出现未捕获的类型错误?

来自分类Dev

以下代码中的错误是什么?

来自分类Dev

以下代码中超级指向什么?

来自分类Dev

为什么在以下代码段中无法访问from的变量值?

来自分类Dev

为什么在以下代码中使用类型为CAN_TypeDef的指针?

来自分类Dev

为什么以下代码显示不支持的操作数类型错误?

来自分类Dev

为什么以下代码显示错误?

来自分类Dev

为什么他的以下代码无法在链表中的特定位置插入节点?

来自分类Dev

为什么以下代码不终止?

来自分类Dev

为什么我在以下代码中在 Python3 中收到 KeyError?

来自分类Dev

Golang中以下代码行是什么意思?

Related 相关文章

  1. 1

    为什么以下代码会转换为Java字节码中的新+ dup op指令?

  2. 2

    为什么以下代码自动装箱到错误的类型并进行编译?

  3. 3

    为什么在以下带有defer的golang代码示例中得到0和1

  4. 4

    为什么警报框在以下代码中不断触发?

  5. 5

    为什么以下代码在C ++中是非法的

  6. 6

    为什么以下代码段可以加快代码速度?

  7. 7

    当其他成员设置为新值时,C联合成员将给出特定/错误值。为什么在C中的以下代码中输出此结果?

  8. 8

    以下代码在cpython中做什么

  9. 9

    以下代码段的输出是什么,为什么?

  10. 10

    以下代码中“ *&”的用法是什么

  11. 11

    Java类型清除:为什么以下代码段无法编译?

  12. 12

    以下代码的输出是什么,为什么?

  13. 13

    以下代码在C中做什么?

  14. 14

    为什么以下代码会运行?

  15. 15

    为什么在以下代码中无法投射类型为'WhereSelectEnumerableIterator的对象?

  16. 16

    以下代码中\ +的含义是什么

  17. 17

    为什么在以下代码中得到NullPointerException?

  18. 18

    为什么以下代码无法编译?

  19. 19

    为什么在以下代码中出现未捕获的类型错误?

  20. 20

    以下代码中的错误是什么?

  21. 21

    以下代码中超级指向什么?

  22. 22

    为什么在以下代码段中无法访问from的变量值?

  23. 23

    为什么在以下代码中使用类型为CAN_TypeDef的指针?

  24. 24

    为什么以下代码显示不支持的操作数类型错误?

  25. 25

    为什么以下代码显示错误?

  26. 26

    为什么他的以下代码无法在链表中的特定位置插入节点?

  27. 27

    为什么以下代码不终止?

  28. 28

    为什么我在以下代码中在 Python3 中收到 KeyError?

  29. 29

    Golang中以下代码行是什么意思?

热门标签

归档