我聲明了以下類型type TestFn func(id int, ctx context.Context) errorvar Func1 = TestFn(func(id int, ctx context.Context) error { // do some work -- the execution block is concurrent safe}var Func2 = TestFn(func(id int, ctx context.Context) error { // do some work}var Func3 = TestFn(func(id int, ctx context.Context) error { // do some work}func Execute() for i := 0; i < 5; i++ { go Func1(i, ctx) go Func2(i, ctx) go Func3(i, ctx) }}由于 ,是全局變量并分配給函數,我可以在具有不同參數的多個 go 例程中運行相同的函數嗎?Func1Func2Func3
2 回答

阿波羅的戰車
TA貢獻1862條經驗 獲得超6個贊
規則很簡單:對于來自多個 goroutine(無同步)的并發訪問,其中至少有一個訪問是寫入,則沒有一個值是安全的。
您的示例僅讀取函數變量,因此它是安全的。如果有一個戈魯廷在執行的同時運行,那將修改函數變量,那將是不安全的。但這在你的例子中不會發生。Execute()
注意:你的函數變量當然會在包初始化期間編寫一次。這發生在開始之前的單個戈魯丁中。main()

婷婷同學_
TA貢獻1844條經驗 獲得超8個贊
是的,您的代碼有效。
如果一個 goroutine 試圖重新分配 的值,而另一個 goroutine 試圖開始相同的值,你會遇到問題 - 這將是一個競爭條件。FuncXX
FuncXX
- 2 回答
- 0 關注
- 134 瀏覽
添加回答
舉報
0/150
提交
取消