1

我的接口要求其实现者具有 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 (type Ticker has no field or method Tick)”

我知道接口只有方法 Click() 但由于 FakeWriter 正在实现接口,它不应该能够调用自己的方法 Tick() 吗?

4

2 回答 2

4

您需要将 interface{} 转换为 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()
}
于 2018-02-14T19:50:29.453 回答
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)) 的版本,则当断言失败时,类型断言将导致恐慌。

于 2018-02-14T19:54:11.050 回答