Ваша функция func showHeight(p plant)
принимает интерфейс в качестве параметра, и интерфейс принимает только те типы, которые вы реализуете.
С комментариями к регистру //grow()
Поскольку вы прокомментировали grow()
plant
имеет только один метод getHeight()
, который вы реализовали для plant 1
и plant 2
, и все идет гладко.
Случай без комментариев grow()
Теперь ни один из ваших типов (plant1или установка 2) реализовать интерфейс plant
, поскольку grow()
был определен для *plant1
, а *plant2
не для plant1
и plant2
.Результат;Ваша функция showHeight(p plant)
, которая принимает интерфейс типа установки, не может принять pl
, p2
, поскольку они больше не относятся к типу plant
.
Исправление:
Передача указателей для работы в качествеshowHeight(&p1)
и showHeight(&p2)
, а в случаях определения функции и операторах печати заменить plant1
и plant2
на *plant1
и *plant2
Может возникнуть путаница: getHeight
не былореализовано в *plant1
и *plant2
, почему *plant1
и *plant2
имеют тип plant
?Логика: когда вы передаете указатели, значения могут быть получены из них, чтобы вызвать getHeight
, но когда вы передаете значения, не может быть получен адрес для вызова grow()
SIDENOTE: p.(*plant2).getHeight()
может бытьизменено на p.getHeight()
, поскольку p является интерфейсом и может вызывать свои собственные методы.