Go не поддерживает полиморфизм таким образом, а также не поддерживает наследование так, как это делают C # или Java.Встроенные структуры буквально просто встроены, они не создают классическую иерархию наследования.Они просто передают в структуру-упаковку все открытые методы и поля встроенной структуры (с некоторыми тонкими предостережениями - посмотрите spec )
Тем не менее, в вашем примере RecordRef
не относится к BaseRef
с точки зрения его типа, вместо этого его можно считать «содержащим» указатель на BaseRef
.Чтобы ваша программа компилировалась, вам нужно будет явно назначить встроенный BaseRef
, например, так:
getRequest.BaseRef = &recordRef.BaseRef
Поскольку этот код, на который вы ссылаетесь, был автоматически сгенерирован из WSDL, он может быть немного громоздкимобновить GetRequest
, чтобы обеспечить BaseRef
подобную структуру данных более полиморфным, гибким способом, но для этого вам нужно будет использовать интерфейсы Go.
Вы можете обновить GetRequest
, чтобы иметь метод с типами accept в типе интерфейса, скажем, XmlRef
, который предоставит получатели, которые могут получить данные, которые вам нужно назначить для GetRequest
Например,
type XmlRef interface {
Name() string
InternalID() string
ExternalID() string
}
func (r *GetRequest) SetRef(ref XmlRef) {
r.BaseRef.Name = ref.Name()
// etc...
}
Затем просто реализуйте интерфейс для RecordRef
и любых других структур, которые необходимо будет использовать в этом контексте.