Что это значит, если поле «фильтруется» в Go? - PullRequest
5 голосов
/ 18 марта 2020

В документации Go тип часто показывает только экспортированные поля. Например, документация time.Timer (https://golang.org/pkg/time/#Timer) показывает следующее:

Тип Timer

Тип Timer представляет одно событие. Когда время таймера истечет, текущее время будет отправлено C, если только таймер не был создан AfterFun c. Таймер должен быть создан с NewTimer или AfterFun c.

type Timer struct {
     C <-chan Time
     // contains filtered or unexported fields
}

Go капитализирует, чтобы дифференцировать экспортируемые и неэкспортированные поля, так что это понятно. Однако что значит (например, в контексте комментария выше) содержать «отфильтрованные» поля?

1 Ответ

6 голосов
/ 18 марта 2020

Этот комментарий создается кодом go/printer на основе переданного ему AST. Некоторые из узлов AST имеют поле , которое помечает их как неполные, и это поле используется принтером для принятия решения , печатать или нет этот комментарий. Однако у принтера нет возможности узнать правила и причины того, почему это поле было установлено в true или false, и поэтому по соглашению предполагается, что это было сделано фильтром, наиболее распространенным из которых является exportFilter следовательно, язык.

Поле Incomplete экспортируется и может быть установлено в значение true / false любым, кто имеет доступ к AST. Вы можете самостоятельно пройти AST, установив для каждого поля Incomplete значение true, оставив узлы нетронутыми, а затем передав AST на принтер, который затем создаст структуры со всеми их полями, экспортированными и не экспортированными, а также этот комментарий.

Godo c фильтрует AST с ast.FileExports, который по умолчанию удаляет только неэкспортированные узлы, а затем передает AST на принтер. Таким образом, в случае Godo c «фильтрованный» в этом комментарии является синонимом «неэкспортированного».


Ссылка на игровую площадку для иллюстрации поведения принтера.

...