Нет ничего плохого в ваших определениях интерфейса.Проблема в том, что вы неправильно конвертируете []Hammer
в []HammerInterface
.Похоже, что вы ожидаете, что это произойдет волшебным образом, но это не так.
В этом фрагменте кода:
func (t Toolbox) GetHammers() []HammerInterface {
return []HammerInterface{t.Hammers}
}
Вы, вероятно, ожидаете, что возвращаемый результат является частью3 HammerInterface
с, но вместо этого вы получаете один HammerInterface
, который на самом деле представляет собой срез из трех Hammers
с.
Это преобразование необходимо выполнить вручную.См. этот пост для получения более подробной информации.
func (t Toolbox) GetHammers() []HammerInterface {
hammerInterfaces := make([]HammerInterface, len(t.Hammers))
for i, hammer := range t.Hammers {
hammerInterfaces[i] = t.Hammers[i]
}
return hammerInterfaces
}
В большинстве реальных сценариев ваша ошибка будет обнаружена компилятором, потому что ваш кусок молотков (t.Hammers
) не будетудовлетворяет интерфейсу HammerInterface
, но в вашем случае, поскольку этот интерфейс пуст, он соответствует любому типу , как interface{}
.