【发布时间】:2016-11-11 20:27:34
【问题描述】:
我正在尝试编写一个简单的服务器/客户端聊天程序以用于学习目的,但我被卡住了。我想让Leave 函数删除它传递的指针并更新结构中的切片,以便指针不再存在。但它不起作用。
type Room struct {
Name string
Visitors []*net.Conn
}
func (r *Room) Leave(pc *net.Conn) {
for i, pv := range r.Visitors {
//found the connection we want to remove
if pc == pv {
fmt.Printf("Before %v\n",r.Visitors)
r.Visitors = append(r.Visitors[:i], r.Visitors[i+1:]...)
fmt.Printf("Before %v\n",r.Visitors)
return
}
}
}
【问题讨论】:
-
删除逻辑是正确的(您的输出也证实了这一点)。问题可能是多个 goroutine 之间缺乏或不正确的同步(您的问题没有说明这一点),或者您的代码的其他部分可能存在您尚未发布的其他问题。
-
确实没有努力确保它适用于多个 goroutine,但我想,让我们确保它适用于单个 goroutine,然后在它适用于一个线程时添加并发检查(也许这是一种不好的心态)。如果您有时间查看,我会将所有代码放在gist 中
标签: go struct slice side-effects