Почему рекомендуется использовать ctx в качестве первого параметра? - PullRequest
0 голосов
/ 25 мая 2018

Я новичок в Голанге.Как сказано в документации

Не храните контексты внутри типа структуры;вместо этого передайте контекст явно каждой функции, которая в этом нуждается.Контекст должен быть первым параметром, обычно называемым ctx

, но я обнаружил, что в типичной функции обработки запросов http объект http.Request имеет метод .Context(), который может извлечь контекст, который ассоциируется с запросом httpс.

Итак, почему рекомендуем использовать контекст в качестве первого параметра в этой функции.Разве это разумно в этой ситуации?


Я знаю, что это не ограничивающее правило.Но я не хочу знать, почему HandlerFunc равен func(ResponseWriter, *Request) вместо func(context.Context, ResponseWriter, *Request)

Очевидно, HandlerFunc нарушает рекомендацию.

1 Ответ

0 голосов
/ 25 мая 2018

Как описано в приведенной вами документации, ctx должен быть ( очень ) общим аргументом для многих функций.Это похоже на то, как многие функции возвращают error.Лучшее место для общего аргумента / возвращаемого значения - либо первое, либо последнее в списке.(Возможно, Go мог бы сделать так, чтобы error всегда было первым возвращаемым значением - я не буду обсуждать это здесь).

Поскольку переменные переменные могут только будет последним в списке аргументов функции, поэтому единственный аргумент для общего аргумента будет первым.

Я думаю, именно поэтому ctx всегда первый.

Этот шаблон часто встречается и с другими переменными в Go (и других языках).Каждый раз, когда общая переменная используется набором связанных функций, эта общая переменная часто стоит первой в списке аргументов (или, возможно, второй после ctx).


Вопреки приведенному вами советуСуществуют библиотеки, которые хранят ctx в структуре, а не передают ее в качестве первого аргумента.Обычно это (всегда?) Библиотеки, которые нужно было заново установить для использования ctx, задолго до того, как контракт с библиотекой был заключен в камень (гарантией совместимости с Go 1.x).

Как правило, выследует следовать совету, чтобы передать ctx в качестве первого аргумента для любой новой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...