Шаг 95.
Язык программирования Go.
Встраивание значений

    На этом шаге мы рассмотрим встраивание значний в программах на языке Go.

    Рассмотрим простой пример двух структур:

type Человек  struct{
   Пол string  // Именованное поле(агрегирование)
   Имя []string // Именованное поле(агрегирование)
   Фамилия string// Именованное поле(агрегирование)
}
type Писатель1 struct{
   Имена Человек // Именованное поле(агрегирование)
   Книга []string // Именованное поле(агрегирование)
   ГодРождения int // Именованное поле(агрегирование)
}

    Все поля в структуре Писатель1 имеют имена. Рассмотрим использование этих структур:

автор1 := Писатель1{Человек{"м", []string{"Роберт", "Льюис", "Бэлфур"},
   "Стивенсон"}, []string{"Черная стрела", "Остров сокровищ"}, 1850}
fmt.Println(автор1)
автор1.Имена.Пол = "ж"
автор1.Имена.Имя = []string{"Джоан", "Кэтлин"}
автор1.Имена.Фамилия = "Роулинг"
автор1.Книга = []string{"Гарри Поттер и философский камень",
   "Фантастические звери и места их обитания"}
автор1.ГодРождения = 1965
fmt.Println(автор1)

    Здесь сначала создается значение типа Писатель1, затем по порядку заполняются все его поля, и значение выводится. Далее поля структуры изменяются, и она снова выводится в консоль.

    Для встраивания анонимного поля используется имя типа без определения имени поля.

type Писатель2 struct {
   Человек // Анонимное поле (встраивание)
   Заглавие []string // Именованное поле (агрегирование)
   ГодРождения int // Именованное поле (агрегирование)
}

    Обращаться к полям в этом поле можно непосредственно (то есть без указания имени типа) или используя имя типа, если это необходимо для устранения неоднозначности, при наличии одноименных полей во вмещающей структуре.

    Структура Писатель2 встраивает структуру Человек как анонимное поле. Это означает, что к полям структуры Человек можно обращаться непосредственно (за исключением случаев, когда необходимо избежать неоднозначности).

автор1 := Писатель2{Человек{"м", []string{"Роберт", "Льюис", "Бэлфур"},
   "Стивенсон"}, []string{"Черная стрела", "Остров сокровищ"}, 1850}
fmt.Println(автор1)
автор1.Пол = "ж"
автор1.Имя = []string{"Джоан", "Кэтлин"}
автор1.Фамилия = "Роулинг"
автор1.Книга = []string{"Гарри Поттер и философский камень",
   "Фантастические звери и места их обитания"}
автор1.ГодРождения = 1965
fmt.Println(автор1)

    В этом фрагменте повторяется программный код, где использовалась структура Писатель1, но на этот раз в нем используется структура Писатель2. Он производит идентичный вывод. За счет встраивания структуры Человек в виде анонимного поля удалось получить практически тот же эффект, как при непосредственном добавлении полей структуры Человек. Значение типа Писатель2 создается точно так же, как значение типа Писатель1, но на этот раз к полям структуры Человек можно обращаться непосредственно.

    Архив с примером можно взять здесь.

    На следующем шаге будем рассматривать встраивание анонимных значений с методами в программах на Go.


Предыдущий шаг Содержание Следующий шаг