接口类型的Golang String方法

th父

我正在解决《 Go编程语言》一书中的问题,在练习7.13中,需要向String接口添加方法。

是否可以向String()接口添加方法?因为直到运行时才知道数据类型。

icza

将方法添加到接口仅意味着将该方法包括在接口类型定义的方法集中。

例如,这是一个接口:

type Fooer interface {
    Foo()
}

它有一种方法:Foo()要将String()方法添加到此接口:

type Fooer interface {
    Foo()
    String() string
}

完毕。我们已将String()方法添加到此接口。

结果是,如果具体类型要实现此Fooer接口,则以前仅具有一个Foo()方法就足够了现在它也必须有一种String()方法。

还要注意,在Go中,实现接口是隐式的。没有意向声明。如果类型具有接口的所有方法,则它隐式满足该接口。

具体类型可能有也可能没有String()方法,而与我们的Fooer界面无关具体类型甚至可能不了解我们的Fooer界面,也不需要。

这是实现此Fooer接口的具体类型

type fooerImpl int

func (f fooerImpl) Foo() {
    fmt.Printf("Foo() called, I'm %d\n", int(f))
}

func (f fooerImpl) String() string {
    return fmt.Sprintf("Foo[%d]", int(f))
}

测试它:

var f Fooer = fooerImpl(3)
f.Foo()
fmt.Println(f.String())
fmt.Println(f)

输出(在Go Playground上尝试):

Foo() called, I'm 3
Foo[3]
Foo[3]

向接口添加方法的后果

如果将新方法任意添加到接口,则可能导致某些以前实现接口的现有具体类型不再实现(由于缺少新添加的方法)。

如果将这些现有的具体类型用作接口的实例,则它们将导致编译时错误,并且在您添加缺少的新方法之前不会起作用。例如,如果我们fooerImpl.String()从上面的示例中删除该方法,则代码将var f Fooer = fooerImpl(3)导致编译时错误:

cannot use fooerImpl(3) (type fooerImpl) as type Fooer in assignment:
    fooerImpl does not implement Fooer (missing String method)

如果没有将现有的具体类型直接用作接口的实例,而是例如将它们传递给包装在空接口中的对象,interface{}并且使用类型断言来提取接口的值,则这些类型断言将不再成立类型断言的“简单”形式x.(T)将导致运行时恐慌,特殊形式v, ok := x.(T)将返回nilfalse

例如,使用上面的fooerImpl类型而不使用String()方法:

var f0 interface{} = fooerImpl(3)
f := f0.(Fooer)

导致运行时恐慌:

panic: interface conversion: main.fooerImpl is not main.Fooer: missing method String

并使用类型转换的特殊形式:

if f, ok := f0.(Fooer); ok {
    f.Foo()
} else {
    fmt.Println("Not instance of Fooer!", f)
}

结果是:

Not instance of Fooer! <nil>

如果有可能,现有的具体类型已经具有您刚刚添加到接口中的方法,并且它具有相同的签名(相同的参数和返回类型),那么这很酷,具体类型将“继续”以实现新接口也。如果签名不匹配(例如,现有方法具有不同的返回类型),则它将不满足该接口,并且与不具有相同名称的方法相同。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

返回接口类型的Java方法

来自分类Dev

返回接口类型的Java方法

来自分类Dev

在包含所述接口类型的成员的类上定义接口类型的正确方法

来自分类Dev

如何获取工厂方法的类属性的接口类型

来自分类Dev

Golang xml.Unmarshal接口类型

来自分类Dev

如何在该接口类型的对象上调用实现接口的类中的方法?

来自分类Dev

返回类型与其所属的名称相同的接口类型方法的用例场景是什么?

来自分类Dev

当类从接口继承且类型从接口类型方法继承时,C#错误CS0738

来自分类Dev

如何在接口类型的引用上调用Object类的方法?

来自分类Dev

接口类型不能静态分配给具有两个变量的方法

来自分类Dev

C#:定义类和接口类型的参数的任何方法吗?

来自分类Dev

如何通过接口类型检测Java局部变量,然后找到在其上调用的方法?

来自分类Dev

接口类型推断

来自分类Dev

如何定义一个通用包装器接口类型并将其用作Java中的方法返回类型?

来自分类Dev

解组为接口类型

来自分类Dev

解组接口类型

来自分类Dev

ICollectionView接口类型的变量

来自分类Dev

接口类型的Java队列

来自分类Dev

值类型如何实现接口类型?

来自分类Dev

接口类型可以包括哪些类型?

来自分类Dev

在Typescript中:有没有一种方法可以内联初始化对象或数组(具有某种接口类型)?

来自分类Dev

我们如何在构造函数方法中的 react typescript 中初始化状态,如果它具有特定的接口类型

来自分类Dev

ByteBuddy中的接口类型非法

来自分类Dev

d:具有接口类型的DesignInstance

来自分类Dev

从JavaScript数组创建接口类型列表

来自分类Dev

如何检查接口类型的联合参数

来自分类Dev

关于特定接口类型的模板分支

来自分类Dev

Java-冲突的接口类型参数

来自分类Dev

Fortran中的接口类型绑定过程

Related 相关文章

  1. 1

    返回接口类型的Java方法

  2. 2

    返回接口类型的Java方法

  3. 3

    在包含所述接口类型的成员的类上定义接口类型的正确方法

  4. 4

    如何获取工厂方法的类属性的接口类型

  5. 5

    Golang xml.Unmarshal接口类型

  6. 6

    如何在该接口类型的对象上调用实现接口的类中的方法?

  7. 7

    返回类型与其所属的名称相同的接口类型方法的用例场景是什么?

  8. 8

    当类从接口继承且类型从接口类型方法继承时,C#错误CS0738

  9. 9

    如何在接口类型的引用上调用Object类的方法?

  10. 10

    接口类型不能静态分配给具有两个变量的方法

  11. 11

    C#:定义类和接口类型的参数的任何方法吗?

  12. 12

    如何通过接口类型检测Java局部变量,然后找到在其上调用的方法?

  13. 13

    接口类型推断

  14. 14

    如何定义一个通用包装器接口类型并将其用作Java中的方法返回类型?

  15. 15

    解组为接口类型

  16. 16

    解组接口类型

  17. 17

    ICollectionView接口类型的变量

  18. 18

    接口类型的Java队列

  19. 19

    值类型如何实现接口类型?

  20. 20

    接口类型可以包括哪些类型?

  21. 21

    在Typescript中:有没有一种方法可以内联初始化对象或数组(具有某种接口类型)?

  22. 22

    我们如何在构造函数方法中的 react typescript 中初始化状态,如果它具有特定的接口类型

  23. 23

    ByteBuddy中的接口类型非法

  24. 24

    d:具有接口类型的DesignInstance

  25. 25

    从JavaScript数组创建接口类型列表

  26. 26

    如何检查接口类型的联合参数

  27. 27

    关于特定接口类型的模板分支

  28. 28

    Java-冲突的接口类型参数

  29. 29

    Fortran中的接口类型绑定过程

热门标签

归档