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 關注
- 135 瀏覽
添加回答
舉報