這個問題在這里已經有了答案: 為什么 Go 在 goroutine 中處理閉包的方式不同? (2 個回答) 無法在 for 回圈中將變數分配給匿名函式 1 個答案 Go 中捕獲的閉包(用于回圈變數) 1 個答案 go vet - 我由 func 字面量捕獲的回圈變數 1 個答案 2天前關閉。
我嘗試在結構中初始化函式。
package main
import "fmt"
type Handler struct {
name string
handler func()
}
func (h *Handler) Emit() {
h.handler()
}
func main() {
var handlers []*Handler
for i := 0; i < 5; i {
handler := func() {
fmt.Printf("There is %d\n", i)
}
handlers = append(handlers, &Handler{
name: fmt.Sprintf("handler_%d", i),
handler: handler,
})
}
for i := 0; i < 5; i {
fmt.Println(handlers[i].name)
handlers[i].Emit()
}
}
但是,我只傳遞了 func 的最后一個指標(實體)。輸出:
handler_0
There is 5
handler_1
There is 5
handler_2
There is 5
handler_3
There is 5
handler_4
There is 5
uj5u.com熱心網友回復:
當您處于回圈中時, i 始終是具有不同值的相同變數,因此當您完成回圈時,所有處理程式的 i = 5。為了糾正這一點,在 for 中創建一個等于 i 的新變數:
for i := 0; i < 5; i {
loop_i := i
handler := func() {
fmt.Printf("There is %d\n", loop_i)
}
handlers = append(handlers, &Handler{
name: fmt.Sprintf("handler_%d", loop_i),
handler: handler,
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520339.html
標籤:去
上一篇:撰寫文本檔案時控制文本對齊方式
下一篇:在主包中添加模塊作為git子模塊