TGViewer
Go tests Go tests @golangtests · 7.84K subscribers
Post #934 1.52K
👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции?

Что выведет этот код и почему на Go 1.27 поведение стало особенно интересным?


package main

import (
"fmt"
"reflect"
)

func makeFn(x int) func() int {
return func() int {
return x
}
}

func main() {
a := makeFn(10)
b := makeFn(20)

pa := reflect.ValueOf(a).Pointer()
pb := reflect.ValueOf(b).Pointer()

fmt.Println(a(), b())
fmt.Println(pa == pb)
}


Интуитивно хочется сказать:

a и b замыкают разные значения, значит это две разные функции и адреса должны отличаться.

Но в Go 1.27 компилятор стал агрессивнее объединять одинаковый машинный код function literals.

У a и b может быть:

один и тот же code pointer
но разное closure data
поэтому a() возвращает 10, а b() - 20

То есть функция в Go на уровне runtime - это не просто адрес машинного кода.

У замыкания фактически есть ещё окружение с захваченными данными.

Именно поэтому сравнивать функции по reflect.Value.Pointer() как способ определить, «одна ли это функция», нельзя.

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