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

How to access type methods that are not defined in 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 (type Ticker has no field or method Tick)"

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

您需要将接口{}转换为 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()
}

I understand that the interface only has method Click() but since FakeWriter is implementing the interface, Shouldn't it be able to call its own method Tick()?

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

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

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

您应该注意,如果您不使用具有两种 return 类型 (fake, ok := clocker.(FakeTicker)) 的版本,当断言失败时类型断言会导致恐慌。