Встроенный исходный код

Где в исходном коде Go я могу найти их реализацию make.

Оказывается, что функция "поиска кода" почти бесполезна для такой центральной функции языка, и у меня нет хорошего способа определить, должен ли я искать функцию C, функцию Go или что.

Также в будущем, как я могу разобраться в этом, не прибегая к просьбе здесь? (то есть: научите меня ловить рыбу)

ИЗМЕНИТЬ Постскриптум Я уже нашел http://golang.org/pkg/builtin/#make, но это, в отличие от остальных пакетов go, не включает ссылку на источник, по-видимому, потому что это где-то глубоко в компиляторе, земля.

Ответ 1

Нет make() как такового. Проще говоря, это происходит:

  • go code: make(chan int)
  • замена символов: OMAKE
  • символ typechecking: OMAKECHAN
  • генерация кода: runtime·makechan

gc, который является парсером C с ароматизированным ароматом, анализирует вызов make в соответствии с контекстом (для упрощения проверки типов 1).

Это преобразование выполняется в cmd/gc/typecheck.go.

После этого, в зависимости от того, какой символ существует (например, OMAKECHAN для make(chan ...)), соответствующий вызов во время выполнения заменяется на cmd/gc/walk.c. В случае OMAKECHAN это будет makechan.

Наконец, при запуске кода вызывается упомянутая замещенная функция в pkg/runtime.

Как вы находите это

Я обычно нахожу такие вещи главным образом, представляя, на какой стадии процесса это может произойти конкретная вещь. В случае make, зная, что нет определение make в pkg/runtime (самый базовый пакет), он должен быть на уровне компилятора и, вероятно, будет заменен на что-то еще.

Затем вам нужно выполнить поиск на разных этапах компилятора (gc, * g, * l), и со временем вы найдете определения.

Ответ 2

На самом деле make представляет собой комбинацию различных функций, реализованных в Go в среде выполнения.

  • makelice, например. make([]int, 10)

  • makemap, например. make(map[string]int)

  • makechan, например. make(chan int)

То же самое относится к другим встроенным устройствам, таким как append и copy.