🧠 Хитрая 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
Код:
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