我的接口要求其实现者具有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()?
答案 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)
)的版本,则断言失败时类型断言会引起恐慌。