如何访问接口中未定义的类型方法?

时间:2018-02-14 19:45:06

标签: go go-interface

我的接口要求其实现者具有Click方法。 但是,实现此接口的FakeTicker类型除了Click方法之外还实现了Tick方法。

package main



type Ticker interface{  
  Click() string 
}

type FakeTicker struct{ 
   val string }

func (f FakeTicker) Click() string {    
   return f.val 
}

func (f FakeTicker) Tick() int {    return 1 }

func main() {   
  var clocker Ticker    
  clocker = FakeTicker{"Val"}   
  clocker.Tick()    
}

这里我收到以下错误“clocker.Tick undefined(类型Ticker没有字段或方法Tick)”

据我所知,界面只有Click()方法,但由于FakeWriter正在实现界面, 它不应该能够调用自己的方法Tick()?

2 个答案:

答案 0 :(得分:3)

您需要将界面{}转换为FakeTicker

package main

type Ticker interface {
    Click() string
}

type FakeTicker struct {
    val string
}

func (f FakeTicker) Click() string {
    return f.val
}

func (f FakeTicker) Tick() int { return 1 }

func main() {
    var clocker Ticker
    clocker = FakeTicker{"Val"}
    fakeTicker := clocker.(FakeTicker)
    fakeTicker.Tick()
}

答案 1 :(得分:1)

  

据我所知,界面只有方法Click(),但由于FakeWriter正在实现界面,难道它不能调用自己的方法Tick()吗?

由于您的clocker变量被定义为Ticker接口,因此您只能在该接口上定义方法。如果您想要访问Tick方法,则必须更改为FakeTicker类型。

在这种情况下,您可以使用类型断言。

func main() {   
    var clocker Ticker    
    clocker = FakeTicker{"Val"}
    clocker.Click()
    fake := clocker.(FakeTicker)
    fake.Tick()    
}

您应该注意,如果您没有使用具有两种返回类型(fake, ok := clocker.(FakeTicker))的版本,则断言失败时类型断言会引起恐慌。