TGViewer
Go for Devs Go for Devs @go_for_devs · 850 subscribers
Post #6 423
🙈 Будьте осторожны с Struct Embedding в Go

В Go есть механизм встраивания структур (struct embedding), который позволяет составлять типы. Примерно это выглядит так:


type Position struct {
X int
Y int
}

type Colour struct {
R byte
G byte
B byte
}

type Rectangle struct {
Position
Colour

Width int
Height int
}

r := Rectangle{/* ... */}

// This works:
fmt.Printf("%d,%d\n", r.Position.X, r.Position.Y)

// but so does this:
fmt.Printf("%d,%d\n", r.X, r.Y)


А как вы думаете, что делает этот код?


type FooService struct {
URL string
}

type BarConnectionOptions struct {
URL string
}

type BarService struct {
BarConnectionOptions
}

type Options struct {
FooService
BarService
}

opts := Options{
FooService: FooService{URL: "abc.com"},
BarService: BarService{
BarConnectionOptions: BarConnectionOptions{
URL: "xyz.com",
},
},
}

fmt.Println(opts.URL)


Я бы ожидал, что компиляция упадет из-за неоднозначности поля URL. На самом деле программа выводит abc.com, по всей видимости, выбирая наименее вложенную версию этого поля. Такое у нас случилось на работе, к счастью, это поймали тесты. Будьте внимательны при встраивании структур!
  • 👍 6
  • ❤ 4
  • 🔥 4
More from @go_for_devs
  1. Sep 30, 2026Тут больше не будет новостей, статей и постов про Go. Go-разработчику сейчас важнее не син…
  2. Apr 16, 2026⚡️ Anthropic выпустили Claude Opus 4.7 Cursor зафиксировал рост с 58% до 70% на своём бенч…
  3. Feb 11, 2026🥳 Состоялся релиз Go 1.26 В релиз вошли несколько заметных изменений: 1. Функция new тепе…
  4. Jan 29, 2026Post #116
  5. Jan 22, 2026Помните, осенью мы писали про запуск опроса Go Survey 2025. Так вот, вчера команда Go опуб…
  6. Jan 21, 2026Философский подход к бэкенду
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →