создается ли пустая структура в Golang каждый раз при ее объявлении?

всем привет. собственно вопрос в сабже. похожий вопрос не нашел ранее. как компилятор Go 1.18 компилирует экземпляр пустой структуры (где пустая структура = type DummyStruct struct{})?

  1. он каждый раз выделяет память?
  2. или создает одну и заменяет все пустые структуры указателями на нее?
  3. или кидает туда "условное ничего", типа nil?

Ответы (1 шт):

Автор решения: Alexander Pavlov

или создает одну и заменяет все пустые структуры указателями на нее?

Да. Причём это работает и даже если два разных типа объявлены как пустая структура

package main

import "fmt"

type DummyStruct struct{}
type DummyStruct2 struct{}

func main() {
    a := DummyStruct{}
    b := DummyStruct{}
    c := *new(DummyStruct)
    d := *new(DummyStruct)
    fmt.Printf("%T %T %T %T\n", a, b, c, d)
    fmt.Printf("%p %p %p %p\n", &a, &b, &c, &d)
    fmt.Printf("%#v %#v %#v %#v\n", a, b, c, d)

    println()

    a2 := DummyStruct2{}
    b2 := DummyStruct2{}
    c2 := *new(DummyStruct2)
    d2 := *new(DummyStruct2)
    fmt.Printf("%T %T %T %T\n", a2, b2, c2, d2)
    fmt.Printf("%p %p %p %p\n", &a2, &b2, &c2, &d2)
    fmt.Printf("%#v %#v %#v %#v\n", a2, b2, c2, d2)
}
main.DummyStruct main.DummyStruct main.DummyStruct main.DummyStruct
0x551048 0x551048 0x551048 0x551048
main.DummyStruct{} main.DummyStruct{} main.DummyStruct{} main.DummyStruct{}

main.DummyStruct2 main.DummyStruct2 main.DummyStruct2 main.DummyStruct2
0x551048 0x551048 0x551048 0x551048
main.DummyStruct2{} main.DummyStruct2{} main.DummyStruct2{} main.DummyStruct2{}
→ Ссылка