栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Go界面中处理重复方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Go界面中处理重复方法?

这样做的方法是显式提供所需的方法,而不是使用速记语法:

type Entertainer interface {    Hello()    Joke()    Jump()}

这看起来像是代码重复,但是请注意,重复代码在Go中并不是一件不典型的事情,尤其是当它导致更清晰的代码时。

另请注意:如果你想在其他语言中典型的继承权,它可能看起来像你做这个丢失一些信息,因为你没有记录的事实,

Entertainer
继承
,比如说,从
Person
。但是Go接口纯粹是结构性的,没有继承。因为一个
Entertainer
具有
Hello()
方法,所以每个
Entertainer
自动为一个
Person
,无论您是否
Person
Entertainer
声明内部明确提及。

即使您不对任何接口使用简写语法,所有这些编译都不会出现问题(“声明的且未使用的”错误除外):

var e Entertainervar ju Jumpervar jo Jokervar p Personp = e    // every Entertainer is also a Personp = ju   // every Jumper is also a Personp = jo   // every Joker is also a Personju = e   // every Entertainer is also a Jumperjo = e   // every Entertainer is also a Joker

这是一个完整的程序,可以编译并正常运行。鉴于以下声明:

package mainimport (    "fmt")type Person interface {    Hello()}type Joker interface {    Hello()    Joke()}type Jumper interface {    Hello()    Jump()}type Entertainer interface {    Hello()    Joke()    Jump()}

让我们创建一个

Clown
类型:

type Clown struct {}func (c Clown) Hello() {    fmt.Println("Hello everybody")}func (c Clown) Joke() {    fmt.Println("I'm funny")}func (c Clown) Jump() {    fmt.Println("And up I go")}

A

Clown
可以打招呼,跳跃和开玩笑,因此它实现了我们所有的接口。鉴于以下四个功能:

func PersonSayHello(p Person) {    p.Hello()}func JumperJump(j Jumper) {    j.Jump()}func JokerJoke(j Joker) {    j.Joke()}func EntertainerEntertain(e Entertainer) {    e.Joke()    e.Jump()}

您可以将a传递

Clown
给其中任何一个:

func main() {    c := Clown{}    PersonSayHello(c)    JokerJoke(c)    JumperJump(c)    EntertainerEntertain(c)}

这是使用上面的代码转到Go Playground的链接。

最后一件事–您可能会这样争论:“但是,如果我以后对进行更改

Person
,它将不会反映在其他界面中。” 的确,您必须手动进行这种调整,但是编译器会告知您。

如果具有此功能:

func JumperSayHello(j Jumper) {    PersonSayHello(j)}

您的代码将正常工作。但是,如果向中添加另一个方法

Person
,则依赖于a
Jumper
是a 的事实的代码
Person
将不再编译。用

type Person interface {    Hello()    Think()}

你得到

。 main.go:18:在PersonSayHello的参数中不能将j(跳线类型)用作Person类型:        跳线未实现Person(缺少Think方法)

只要您在 任何地方 都有依赖于a

Jumper
始终为a
的事实的代码,就属于这种情况
Person
。而且,如果您不这样做,即使在测试中也没有,那么-也许,跳线不认为实际上并不重要?

但是,如果无论出于何种原因,无论您对这些接口进行了什么更改,您实际上都需要确保a

Jumper
始终为a
Person
,但实际上并没有在任何地方使用此事实,则始终可以为此目的创建代码:

package maintype Person interface {    Hello()}type Jumper interface {    Hello()    Jump()}// this function is never used, it just exists to ensure// interface compatibility at compile timefunc ensureJumperIsPerson(j Jumper) {    var p Person = j    _ = p}func main() {}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号