【问题标题】:How to access type methods that are not defined in interface?如何访问接口中未定义的类型方法?
【发布时间】:2018-02-14 19:45:06
【问题描述】:

我的接口要求其实现者具有 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()吗?

【问题讨论】:

  • @p-ray "不应该可以调用自己的自己的方法Tick()吗?"应该可以而且也可以能够。错误不是来自 it 无法调用Tick 而是来自clocker“用户” 无法调用Tick
  • @mkopriva 正如接受的答案中提到的,我认为它需要转换为实现结构。
  • 我的评论的意思是 FakeTicker 可以调用它的 own Tick 方法,例如从它的 own @ 内部987654327@ 方法。 func (f FakeTicker) Click() string { f.Tick(); return f.val }。我只是在这里有点迂腐,请随意忽略我。

标签: go go-interface


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我知道接口只有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)) 的版本,则类型断言会在断言失败时导致恐慌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多