Просто потому, что в этом случае тип Child состоит из чего-то Parent.не значит что это что то.Это два разных типа, поэтому они не могут быть взаимозаменяемы таким образом.
Теперь, если у вас есть интерфейс Parent и ваши дочерние объекты встречают этот интерфейс, тогда мы говорим совсем о другом.
Редактировать 1
Пример
https://play.golang.org/p/i6fQBoL2Uk7
Редактировать 2
package main
import "fmt"
type parent interface {
getParentId() (string)
}
type child1 struct {
child1ID string
}
func (c child1) getParentId() (string) {
return c.child1ID
}
type child2 struct {
child2ID string
}
func (c child2) getParentId() (string) {
return c.child2ID
}
type childCollection struct {
collection []parent
}
func (c *childCollection) appendChild(p parent) {
c.collection = append(c.collection, p)
}
func main() {
c1 := child1{"1"}
c2 := child2{"2"}
c := new(childCollection)
c.appendChild(c1)
c.appendChild(c2)
fmt.Println(c)
}