Как получить доступ к методам типа, которые не определены в интерфейсе?
У меня есть интерфейс, который требует, чтобы его разработчик имел метод Click. Однако тип FakeTicker, реализующий этот интерфейс, также реализует метод Tick в дополнение к методу Click.
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()?
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)
).
Вам нужно будет преобразовать интерфейс {} в 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()
}