package main
import (
"fmt"
)
type S struct {
v int
}
func (s S) Value() int {
return s.v
}
type I interface {
Value() int
}
func mutate(i I) {
// Мы думаем, что меняем реальный объект...
if s, ok := i.(S); ok {
s.v = 100
}
}
func main() {
s := S{v: 10}
var i I = s
mutate(i)
fmt.Println(s.v) // ???
fmt.Println(i.Value()) // ???
}
Всё выглядит так:
Мы передаём объект в mutate → внутри меняем → значения должны измениться.
Тут ловушка в том, что:
- интерфейсы в Go копируют значение, если оно не pointer receiver
- type assertion s, ok := i.(S) создаёт новую копию
- мы мутируем копию, а не оригинал
Так что вывод будет:
10
10
А не 100.
👉 Запустить код
