Вставьте в мой тип другой 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 ответ

Решение

Когда вы ссылаетесь на встроенные поля, вы должны пропустить имя пакета встроенного типа, так как неполное имя типа действует как имя поля.

Spec: Типы конструкций:

Поле, объявленное с типом, но без явного имени поля, является анонимным полем, также называемым встроенным полем или встраиванием типа в структуру. В качестве имени типа должен быть указан внедренный тип. 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,

Другие вопросы по тегам