Golang在另一个结构的方法中更改结构的值

如果我的猜测是正确的,我有结构问题,也可能是指针问题。


这个结构有一些字段和一个保存切片的字段:


type Bot struct {

    // ...

    connlist []Connection

}

这Connection看起来像这样:


type Connection struct {

    conn       net.Conn

    messages   int32

    channels   []string

    joins      int32

    connactive bool

}

我的问题是更改connactiveto的值true。


Bot 有一个监听连接的方法:


func (bot *Bot) ListenToConnection(connection Connection) {

    reader := bufio.NewReader(connection.conn)

    tp := textproto.NewReader(reader)

    for {

        line, err := tp.ReadLine()

        if err != nil {

            log.Printf("Error reading from chat connection: %s", err)

            break // break loop on errors

        }

        if strings.Contains(line, "tmi.twitch.tv 001") {

            connection.activateConn()

        }

        if strings.Contains(line, "PING ") {

            fmt.Fprintf(connection.conn, "PONG tmi.twitch.tv\r\n")

        }

        fmt.Fprintf(bot.inconn, line+"\r\n")

    }

}

并且connection.activeConn()是无法正常工作的部分,该方法如下所示:


func (connection *Connection) activateConn() {

    connection.connactive = true

}

这实际上被执行了,所以这不是连接没有得到响应或其他东西的问题。


但是如果我稍后尝试在 , 的方法中遍历它Bot,connactive总是false出于某种原因(这是默认设置)。


for i := 0; i < len(bot.connlist); i++ {

        log.Println(bot.connlist[i].connactive)

}

我想我正在使用原始连接的副本,而不是具有connactive = true.


有任何想法吗?谢谢您的帮助。


开心每一天1111
浏览 113回答 2
2回答

www说

您的ListenToConnection()方法有一个参数:connection Connection.当您调用此ListenToConnection()方法时(您没有发布此代码),您传递了一个Connection. Go 中的所有内容都是按值传递的,因此将复制传递的值。ListenToConnection()你在里面操作这个副本。你调用它的activateConn()方法,但是那个方法(它有一个指针接收器)将接收这个副本的地址(一个局部变量)。解决方法很简单,将参数的参数ListenToConnection()改为指针:func (bot *Bot) ListenToConnection(connection *Connection) {&nbsp; &nbsp; // ...}使用以下值调用它Bot.connlist:bot.ListenToConnection(&bot.connlist[0])一个for循环调用它的每个元素conlist:for i := range bot.connlist {&nbsp; &nbsp; bot.ListenToConnection(&bot.conlist[i])}注意力!我特意使用了for ... range只使用索引而不使用值的 a 。使用for ... range带有索引和值,或仅使用值,您会观察到相同的问题(connactive将仍然存在false):for _, v := range bot.connlist {&nbsp; &nbsp; bot.ListenToConnection(&v) // BAD! v is also a copy}因为v也只是一个副本,将其地址传递给bot.ListenToConnection(),这只会指向副本而不是connlist切片中的元素。

一只名叫tom的猫

它需要是指向连接的指针片段。如果这个属性会同时改变,信号量是必要的。type Bot struct {&nbsp; &nbsp; // ...&nbsp; &nbsp; conns []*Connection}func (bot *Bot) ListenToConnection(c *Connection) {&nbsp; &nbsp;// code}type Connection struct {&nbsp; &nbsp; conn&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;net.Conn&nbsp; &nbsp; messages&nbsp; &nbsp; &nbsp;int32&nbsp; &nbsp; channels&nbsp; &nbsp; &nbsp;[]string&nbsp; &nbsp; joins&nbsp; &nbsp; &nbsp; &nbsp; int32&nbsp; &nbsp; isActive&nbsp; &nbsp; &nbsp;bool&nbsp; &nbsp; isActiveLock sync.RWMutex}func (c *Connection) activateConn() {&nbsp; &nbsp; c.isActiveLock.Lock()&nbsp; &nbsp; defer c.isActiveLock.Unlock()&nbsp; &nbsp; c.isActive = true}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go