Вы используете метод UniversalError()
, но вы не добавили его в определение интерфейса, поэтому сделайте это:
type UniversalError interface {
CommonError1
UniversalError()
}
И вы хотите, чтобы Error3
было UniversalError
. Чтобы Error3
было UniversalError
, оно должно реализовать все свои методы: UniversalError()
и CommonError1()
. Таким образом, вы должны добавить оба этих метода:
func (Error3) CommonError1() {}
func (Error3) UniversalError() {}
С этими изменениями вывод будет (попробуйте на Go Playground ):
**** Types *****
Error belongs to an unidentified type
Error belongs to an unidentified type
CommonError1 found, but Does not belong to Error1 or Error2
Подсказка: Если вы хотите гарантировать во время компиляции, что какой-то конкретный тип реализует некоторый интерфейс, используйте пустое объявление переменной, например:
var _ UniversalError = Error3{}
Приведенное выше объявление присваивает значение Error3
переменной типа UniversalError
. Если Error3
не удовлетворяет UniversalError
, вы получите ошибку во время компиляции. Приведенное выше объявление не вводит новую переменную, так как использовался пустой идентификатор , это просто проверка во время компиляции.
Если вы удалите метод Error3.CommonError1()
:
//func (Error3) CommonError1() {}
func (Error3) UniversalError() {}
Тогда вы сразу получите сообщение об ошибке компиляции:
./prog.go:49:5: cannot use Error3 literal (type Error3) as type UniversalError in assignment:
Error3 does not implement UniversalError (missing CommonError1 method)