2 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
因為在serve()你的循環(huán)變量中使用了你在一個單獨的 goroutine 上執(zhí)行的函數(shù)文字,它被運行循環(huán)的 goroutine 同時修改:數(shù)據(jù)競爭。如果您有數(shù)據(jù)競爭,則行為是未定義的。
如果您復制變量,它將起作用:
for req := range reqs {
? ? sem <- 1
? ? req2 := req
? ? go func() {
? ? ? ? process(req2)
? ? ? ? <-sem
? ? }()
}
在Go Playground上嘗試一下。
另一種可能性是將其作為參數(shù)傳遞給匿名函數(shù):
for req := range reqs {
? ? sem <- 1
? ? go func(req *Request) {
? ? ? ? process(req)
? ? ? ? <-sem
? ? }(req)
}
在Go Playground試試這個。

TA貢獻1789條經(jīng)驗 獲得超8個贊
這是因為當匿名執(zhí)行時,請求已經(jīng)從移動Request{0}到Request{1},所以你打印從{start 1}。
// method 1: add a parameter, pass it to anonymous function
func serve(reqs chan *Request) {
for req := range reqs {
sem <- 1
// You should make the req as parameter of this function
// or, when the function execute, the req point to Request{1}
go func(dup *Request) {
process(dup)
<-sem
}(req)
}
// And you should wait for the Request{9} to be processed
time.Sleep(time.Second)
}
// method 2: make for wait anonymous function
func serve(reqs chan *Request) {
for req := range reqs {
go func() {
process(req)
sem <- 1
}()
// Or wait here
<-sem
}
}
- 2 回答
- 0 關注
- 155 瀏覽
添加回答
舉報