2016-04-12 4 views
-1

Основываясь на приведенном ниже примере, кажется, что точка «встраивания структуры в поле» заключается в нарушении механизма продвижения «Го». Зачем вам это делать?Какова цель выделения структуры в поле (golang)?

type obj1 struct { 
    obj2 
} 

type obj1Selector struct { 
    selector obj2 
} 

type obj2 struct { 
} 

func (o obj2) printTest() { 
    fmt.Println("obj2") 
} 

func main() { 
    o := obj1{} 
    o.printTest() //fine 

    oSelector := obj1Selector{} 
    oSelector.selector.printTest() //fine 
    oSelector.printTest() //not fine 
+4

Каждый раз, когда вы используете 'this', умирает котенок. Следуйте рекомендациям [Effective Go] (https://golang.org/doc/effective_go.html) и дайте ему собственное имя. Например: 'func (o obj2) printTest() ...' – eduncan911

+2

Я не понимаю, что вы спрашиваете или как это вообще относится к пакету «go/types» (который вы не используете) , Что вы ожидаете отсюда? – JimB

+1

Я исправил это. Пожалуйста, прекратите причинять вред животным. – Charlie

ответ

1

Вы не альясинга ничего и селекторы относятся к множеству вещей, которые можно ссылаться на тип, используя точечную нотацию. Вы используете концепцию, называемую вложением, obj1 вставляет obj2. obj1Selector имеет одно поле под названием selector типа obj2. И псевдоним будет выглядеть так; type obj3 obj2, который объявляет obj3 в качестве псевдонима для obj2.

Это нарушает механизм продвижения Go? Извините, но вся ваша идея, как это работает, не зависит от вас. obj1Selector не вставляет тип obj2 и поэтому не имеет полей/методов от obj2 'promoted', obj1 вставляет obj2 и, следовательно, имеет свои поля/методы 'promotioned'. obj1Selector не реализует этот интерфейс, obj1Selector.selector.

Зачем мне вставлять? Ну, это несколько эквивалентно наследованию или, по крайней мере, обеспечивает аналогичный набор функций при разработке в Go. Возможно, у меня есть несколько записей в хранилище данных, в которых все разделяют 10 общих полей, а затем имеют еще 10 полей, которые зависят от той таблицы, из которой они сошли. Так же, как я использовал наследование для уменьшения дублирования в типичных языках OO, таких как C++, C# или Java, я бы использовал вложение в Go. На мой взгляд, это основной прецедент для этого. Это своего рода странное сочетание композиции и наследования. Вы сочиняете объект других (те, которые вы внедряете), но так как методы/поля внедренных типов продвигаются в область вложений, они много работают, как если бы наследователь, унаследованный от встроенного типа. Надеюсь, что дается некоторое разъяснение относительно того, с чем вы здесь сталкиваетесь ... На самом деле вы не задали вопрос, на который можно ответить, но в комментариях нет места для такого длинного объяснения особенностей/концепций, re используя ваш пример кода.

+0

Ваш ответ поможет мне понять, что я не создаю псевдоним, но я до сих пор не знаю, почему вы когда-либо «встраивали тип в поле», как вы сказали. Как вы сказали, не будет ли это смешение «наследования», а состав - очень запутанным способом в одном типе? – Charlie

+0

@Charlie может показаться немного запутанным, исходя из языка, где эти два понятия различны, но это довольно интуитивно понятно, как только вы начнете его использовать. Если вам нужна иерархия наследования, как вы делали бы с использованием родительского и дочернего классов в типичных языках OO, вместо этого вы добавляете базовый тип в другие для достижения той же функциональности. Есть некоторые тонкости в том, как он работает, но, вероятно, проще всего начать рассматривать его как эквивалентное наследованию. – evanmcdonnal

+0

Ваш ответ не ответил на мой вопрос, но я ценю, что вы помогаете мне говорить об этом более четко. Пожалуйста, прочтите мой уточненный вопрос здесь http://stackoverflow.com/questions/36704522/why-would-you-want-to-use-composition-in-golang – Charlie

Смежные вопросы