У меня есть программа, которая пытается реализовать функции в «подклассах», где родитель может проверить, реализован ли интерфейс. Для перспективы он действительно имеет дело с созданием URL REST на основе того, существуют ли методы.Встроенный интерфейс Golang на родительской структуре
Что я натолкнулся на то, что на основе следующего шаблона интерфейсы IList и IGet находятся на объекте TestController, когда реализовано только 1. Когда вызывается интерфейс IGet, я получаю панику.
Я бы предпочел не делать конкретные определения Get/List на базовой структуре, а затем их переопределять, скорее всего, проведет проверку на существование, а затем оттуда.
Вот ссылка идут площадка, а https://play.golang.org/p/5j58fejeJ3
package main
import "fmt"
type IGet interface {
Get(int)
}
type IList interface {
List(int)
}
type Application struct {
name string
}
type BaseAppController struct {
*Application
IGet
IList
}
type TestController struct {
*BaseAppController
}
func (ctrl *BaseAppController) Init() {
fmt.Println("In Init")
if f, ok := interface{}(ctrl).(IGet); ok {
fmt.Println("Controller Found GET", f)
} else {
fmt.Println("Controller NOT Found GET", f)
}
if f, ok := interface{}(ctrl).(IList); ok {
fmt.Println("Controller Found LIST", f)
} else {
fmt.Println("Controller NOT Found LIST", f)
}
}
func (ctrl *BaseAppController) Call() {
fmt.Println("In Call")
if f, ok := interface{}(ctrl).(IGet); ok {
fmt.Println("Controller Found GET - going to call", f)
f.Get(7)
} else {
fmt.Println("Controller NOT Found GET - can't call", f)
}
}
// Test controller implements the Get Method
func (ctrl *TestController) Get(v int) {
fmt.Printf("Hi name=%s v=%d\n", ctrl.name, v)
}
func main() {
app := Application{"hithere"}
ctrl := TestController{&BaseAppController{Application: &app}}
ctrl.Init()
ctrl.Call()
}
Реальный код никогда не имеет Iget (только ленивый для примера). Вторая версия, которую вы отправили, помещает Init в окончательную структуру, что, конечно же, дает ему доступ к интерфейсам. Если моя цель состоит в том, чтобы иметь эффективный и абстрактный базовый класс, где мне не нужно иметь конкретную реализацию на каждом контроллере, это невозможно. Возможно, это не так, но это было бы очень полезно. FYI - Большая часть этого я пытаюсь понять возможности, что можно сделать с интерфейсами. – koblas
@koblas Совершенно возможно, вы просто делаете это назад. Вместо встраивания интерфейсов базовый класс _can_, но _doesn't иметь to_ реализовать (поскольку вложение их по определению заставляет их реализовать их), вставьте базовый класс в дополнительные структуры, которые также реализуют «IGet» или «IList», и имеют интерфейс с необходимыми методами для прохождения. Пример: https://play.golang.org/p/SXuGc8fAMY – Kaedys