2 回答
TA贡献1775条经验 获得超8个赞
您的ListenToConnection()方法有一个参数:connection Connection.
当您调用此ListenToConnection()方法时(您没有发布此代码),您传递了一个Connection. Go 中的所有内容都是按值传递的,因此将复制传递的值。ListenToConnection()你在里面操作这个副本。你调用它的activateConn()方法,但是那个方法(它有一个指针接收器)将接收这个副本的地址(一个局部变量)。
解决方法很简单,将参数的参数ListenToConnection()改为指针:
func (bot *Bot) ListenToConnection(connection *Connection) {
// ...
}
使用以下值调用它Bot.connlist:
bot.ListenToConnection(&bot.connlist[0])
一个for循环调用它的每个元素conlist:
for i := range bot.connlist {
bot.ListenToConnection(&bot.conlist[i])
}
注意力!我特意使用了for ... range只使用索引而不使用值的 a 。使用for ... range带有索引和值,或仅使用值,您会观察到相同的问题(connactive将仍然存在false):
for _, v := range bot.connlist {
bot.ListenToConnection(&v) // BAD! v is also a copy
}
因为v也只是一个副本,将其地址传递给bot.ListenToConnection(),这只会指向副本而不是connlist切片中的元素。
TA贡献1906条经验 获得超3个赞
它需要是指向连接的指针片段。如果这个属性会同时改变,信号量是必要的。
type Bot struct {
// ...
conns []*Connection
}
func (bot *Bot) ListenToConnection(c *Connection) {
// code
}
type Connection struct {
conn net.Conn
messages int32
channels []string
joins int32
isActive bool
isActiveLock sync.RWMutex
}
func (c *Connection) activateConn() {
c.isActiveLock.Lock()
defer c.isActiveLock.Unlock()
c.isActive = true
}
- 2 回答
- 0 关注
- 112 浏览
添加回答
举报