Допустим, у нас есть следующий код:
func doubler(num int) {
return num + num
}
doubler(5)
вернет 10
.go doubler(5)
также вернет 10
.
Вы можете сделать то же самое с каким-то локальным хранилищем потока, если хотите:
func doubler() {
return getThreadLocal("num") + getThreadLocal("num")
}
И мы можем запустить это с чем-токак:
go func() {
setThreadLocal("num", 10)
doubler()
}()
Но что яснее?Вариант, который явно передает аргумент num
, или вариант, который «волшебным образом» получает это из своего рода локального хранилища потока?
Это то, что подразумевается под «действием на расстоянии».Линия setThreadLocal("num", 10)
(которая удалена) влияет на поведение doubler()
.
Этот пример явно искусственный, но тот же принцип применим к более реальным примерам.Например, в некоторых средах весьма распространено использование локальных потоковых вещей, таких как информация о пользователе или другие «глобальные» переменные.
Вот почему в цитируемом вами абзаце он сравнивается с глобальными переменными: thread-localхранилище - это глобальные переменные, применимые только к текущему потоку.
Когда вы передаете параметры в качестве аргументов, вещи намного яснее определены.Не существует волшебного (часто недокументированного) глобального состояния, о котором вам нужно помнить при отладке или написании тестов.