1 回答
TA贡献1843条经验 获得超7个赞
我想说的几点:
确保您的程序没有争用条件(例如。 是全局可访问的,如果同时进行读/写或写/写,则应受到保护)。
clients
在切片上划线时,您不需要检查非nil切片是否已经处理了该范围(请参阅我共享的代码)。
for [...] range [...]
它有时会发生在您的身上,因为有时失败并返回错误,并且在范围越广时删除元素的错误逻辑使您的程序恐慌。(请参阅我共享的代码)
conn.WriteJSON
package main
import "fmt"
func main() {
var conns []string = nil
// "if conns != nil" check is not required as "for [...] range [...]"
// can handle that. It is safe to use for "range" directly.
for i, conn := range conns {
fmt.Println(i, conn)
}
conns = []string{"1", "2", "3"}
// Will panic
for i := range conns {
fmt.Printf("access: %d, length: %d\n", i, len(conns))
conns = append(conns[:i], conns[i+1:]...)
}
}
在此示例中,您可以看到您尝试访问的索引大于或等于触发 panic 的切片的长度。我认为这个答案应该可以帮助您纠正逻辑,或者您也可以使用地图来存储连接,但它再次带有自己的警告,例如没有排序保证,即它从地图中读取的顺序。
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报