我有一个接口,要求它的实现者有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未定义( Ticker类型没有字段或方法滴答)“
我知道这个接口只有方法Click(),但是既然FakeWriter正在实现这个接口,它难道不能调用它自己的方法Tick()吗?
发布于 2018-02-14 19:54:11
我知道这个接口只有方法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-14 19:50:29
您需要将接口{}转换为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()
}https://stackoverflow.com/questions/48795043
复制相似问题