這是一個建立於
的文章,其中的資訊可能已經有所發展或是發生改變。
原因golang代碼編寫是允許在同一個for select代碼結構中使用相同的變數名,這樣會造成運行時chan發送的內容出現亂碼現象,亂碼率大概在98%左右,所以這是一個坑,希望大家別重複踩坑。以下是代碼說明:
var DelHubs chan string = make(chan string)
var DelHub chan string = make(chan string)
go func() {
Deller.DelHub <- key
}()
//會出現亂碼的代碼,我在兩個不同的chan中定義並使用了兩個相同命名的變數,這就是造成亂碼問題所在
func delChan() {
for {
select {
case ukey, ok := <-Deller.DelHubs:
if ok {
hs, err := hubStartWith(ukey)
if err != nil {
break
}
for _, v := range hs {
ukeyhid := ukey + ":" + strconv.FormatInt(v.Id, 10)
del(ukeyhid)
go deldos(ukeyhid)
}
}
case ukeyhid, ok := <-Deller.DelHub:
if ok {
del(ukeyhid)
go deldos(ukeyhid)
}
}
}
}
//解決方案,很簡單只要改成各自不同的變數名就可以
func delChan() {
for {
select {
case ukey, ok := <-Deller.DelHubs:
if ok {
hs, err := hubStartWith(ukey)
if err != nil {
break
}
for _, v := range hs {
delhubs := ukey + ":" + strconv.FormatInt(v.Id, 10)
del(delhubs)
go deldos(delhubs)
}
}
case delhub, ok := <-Deller.DelHub:
if ok {
del(delhub)
go deldos(delhub)
}
}
}
}