Из документации Go по объявлениям методов :
Тип получателя должен иметь форму T или * T, где T - имя типа. Т называется базовым типом приемника или просто базовым типом. Базовый тип не должен быть указателем или типом интерфейса и должен быть объявлен в том же пакете, что и метод.
Может ли кто-нибудь дать мне некоторое представление о том, почему это может быть? Существуют ли другие (статически типизированные) языки, которые позволили бы это? Я действительно хочу определить методы в интерфейсе, чтобы я мог рассматривать любой экземпляр данного типа интерфейса как другой. Например (заимствуя пример из статьи Википедии о шаблоне метода шаблона ), если допустимо следующее:
type Game interface {
PlayOneGame(playersCount int)
}
type GameImplementation interface {
InitializeGame()
MakePlay(player int)
EndOfGame() bool
PrintWinner()
}
func (game *GameImplementation) PlayOneGame(playersCount int) {
game.InitializeGame()
for j := 0; !game.EndOfGame(); j = (j + 1) % playersCount {
game.MakePlay(j)
}
game.PrintWinner()
}
Я мог бы использовать любой экземпляр, реализующий «GameImplementation» как «Игру» без какого-либо преобразования:
var newGame Game
newGame = NewMonopolyGame() // implements GameImplementation
newGame.PlayOneGame(2)
ОБНОВЛЕНИЕ: целью этого было попытаться достичь всех преимуществ абстрактных базовых классов без всякой связи, которая идет с явной иерархией. Если бы я хотел определить новое поведение PlayBestOfThreeGames,абстрактные базовые классы потребовали бы от меня изменения самого базового класса - тогда как здесь я просто определяю еще один метод поверх интерфейса GameImplementation