Services = make([]Service, 2)
означает, что у вас есть массив интерфейса Service
На самом деле не имеет значения, какие Service
реализации вы добавляете, пока реализация выполняет контракт Service
, именуемый Start() error
и Stop() error
Когда вы получаете сервис из этого массива с:
Services[0]
во время компиляции, это если типа Service
и поэтому Вы можете получить доступ только ко всем функциям Service
.
Во время выполнения фактический тип, стоящий за Services[0]
, равен NewService1
или, возможно, другой, но это на самом деле не имеет значения, потому что вы указали массив Services
типа Service
и поэтому можете только получить доступ к этим функциям.
Если вы действительно хотите вызвать Fn1
, вы должны сделать предположение, какой фактический тип находится за полями одного массива, и привести их:
Services[0].(*Service1).Fn1()
Если вы хотите избежать паники во время выполнения из-за недопустимых приведений (когда другой тип действительно доступен, как вы ожидаете), пожалуйста, посмотрите, как вы делаете утверждения типа https://golang.org/ref/spec#Type_assertions