Название озадачивает, я уверен, но трудно описать, что я имею в виду.
Я хочу создать интерфейс Go, который имеет два метода; первый возвращает значение, а второй принимает значение. Я хочу убедиться, что метод 1 возвращает тот же тип, что и метод 2, без указания типа (кроме структуры). Например:
type MyInterface interface {
Method1() MyType
Method2(MyType) error
}
Где MyType
может быть любого типа (структуры), при условии, что оно одинаково как в методе 1, так и в методе 2.
Есть ли способ сделать это в Go?
РЕДАКТИРОВАТЬ:
Основываясь на ответе @ iLoveReflection, я попробовал следующее:
package main
type MyInterface interface {
GetType() interface{}
UseType(input interface{})
}
type MyImplementation struct{}
type MyType struct {
}
func (i MyImplementation) GetType() MyType {
return MyType{}
}
func (i MyImplementation) UseType(input MyType) {
return
}
func test(input MyInterface) {
return
}
func assertArgAndResult() {
var v MyImplementation
v.UseType(v.GetType())
}
func main() {
test(MyImplementation{})
}
Итак в основном я указываю интерфейс (MyInterface
) и хочу убедиться, что данная реализация этого интерфейса (MyImplementation
, которая будет создана пользователем моего пакета) соответствует требованию, указанному в исходном сообщении .
assertArgAndResult()
работает должным образом и гарантирует, что MyImplementation
соответствует требованиям. Тем не менее, я получаю ошибку компиляции в функции main()
:
cannot use MyImplementation literal (type MyImplementation) as type MyInterface in argument to test:
MyImplementation does not implement MyInterface (wrong type for GetType method)
have GetType() MyType
want GetType() interface {}