Вставьте в мой тип другой pkg и инициализируйте его буквально
Я прочитал, как инициализировать тип встраивания и связанные с ним вопросы и ответы.
В чем проблема при компиляции этого кода, я получил:
[Ошибка] неизвестное поле 'feature.DefaultSshHelper' в структурном литерале типа dala02
type FDH feature.DefaultSshHelper
type dala02 struct {
Md5_v string
feature.DefaultSshHelper
//FDH
}
var x_01_h1_p = &dala02{
Md5_v: "",
feature.DefaultSshHelper: feature.DefaultSshHelper{
//FDH: FDH{
// blabla
},
}
// use it by a interface []feature.CmdFioHelper{x_00_h1_p}
Сначала я подумал, что это проблема экспорта, поэтому я добавил эту строку 'type FDH feature.DefaultSshHelper'. Теперь у нас есть эта ошибка:
[Ошибка] не может использовать x_01_h1_p (тип *dala02) в качестве типа feature.CmdFioHelper в литерале массива или фрагмента: *dala02 не реализует feature.CmdFioHelper (отсутствует метод Getnextchecker)
Но указатель feature.DefaultSshHelper действительно реализует feature.CmdFioHelper (интерфейс). Таким образом, указатель dala02 должен также реализовать это, верно? (справочная форма вступает в силу)
Есть важный способ, которым вложение отличается от подкласса. Когда мы встраиваем тип, методы этого типа становятся методами внешнего типа, но когда они вызываются, получатель метода является внутренним типом, а не внешним.
Вопрос в том, как исправить эту ошибку компиляции, какая строка неверна? Я не эксперт по Голангу, спасибо за ваш совет:). Кстати, я нашел какой-то обходной путь.
1 ответ
Когда вы ссылаетесь на встроенные поля, вы должны пропустить имя пакета встроенного типа, так как неполное имя типа действует как имя поля.
Поле, объявленное с типом, но без явного имени поля, является анонимным полем, также называемым встроенным полем или встраиванием типа в структуру. В качестве имени типа должен быть указан внедренный тип.
T
или как указатель на имя неинтерфейсного типа*T
, а такжеT
Сам по себе не может быть указателем типа. Неквалифицированное имя типа действует как имя поля.
Так что просто напишите:
var x_01_h1_p = &dala02{
Md5_v: "",
DefaultSshHelper: feature.DefaultSshHelper{
// blabla
},
}
Ваша вторая попытка type FDH feature.DefaultSshHelper
терпит неудачу, так как это объявление типа создает новый тип с нулевыми методами: тип FDH
не "наследует" методы feature.DefaultSshHelper
, И, таким образом, любой тип, который встраивает FDH
также не хватит методов feature.DefaultSshHelper
,