TGViewer
Go tests Go tests @golangtests · 7.84K subscribers
Post #905 3.25K
🧠 Хитрая Go-задача про интерфейсы и память (x64)

Код:


package main

import (
"fmt"
"unsafe"
)

type Foo struct {
A int64
}

type IFoo interface {
Get() int64
}

func (f Foo) Get() int64 { return f.A }

func main() {
var a int64 = 10
var s Foo = Foo{A: 42}
var i IFoo = s

fmt.Println(unsafe.Sizeof(a))
fmt.Println(unsafe.Sizeof(s))
fmt.Println(unsafe.Sizeof(i))
}


Вопросы
Сколько байт занимает a на x64?
• Сколько байт занимает s?
• Сколько байт занимает i?
• Почему размер i не равен размеру Foo?
• Что реально хранится внутри interface{} в Go?

Разберём по шагам, как это работает в Go на x64.

Код:
```go
var a int64 = 10
var s Foo = Foo{A: 42}
var i IFoo = s
```
1) Размер a
unsafe.Sizeof(a)
```go
int64 = 8 байт
```
На x64:

a = 8 байт
2) Размер s
```go
type Foo struct {
A int64
}```

В структуре одно поле int64.
```go
s = 8 байт
```
3) Размер интерфейса i
```go
var i IFoo = s
unsafe.Sizeof(i)
```go
На x64:
```go
i = 16 байт```


Запустить код: https://go.dev/play/p/NLIG3q-jFc9
  • ❤ 4
  • 👍 4
  • 🔥 3
More from @golangtests
  1. Sep 13, 2026👣 Задача на Go 1.27: concurrent job scheduler с generic methods Нужно реализовать библиот…
  2. Sep 13, 2026🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку Можно годами смотреть…
  3. Sep 2, 2026👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции? Что в…
  4. Aug 21, 2026Go-задача: что выведет этот код? package main import "fmt" func main() { var funcs []func(…
  5. Aug 6, 2026Задача Go 1.26, на которой легко ошибиться даже опытному разработчику Что выведет этот код…
  6. Jul 27, 2026🧠 Редкая задача для Go-разработчиков Версия: Go 1.23+ Именно в Go 1.23 появился range по…
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 →