为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
开心每一天1111 2022-01-04 10:23:38
如果我的猜测是正确的,我有结构问题,也可能是指针问题。这个结构有一些字段和一个保存切片的字段: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.有任何想法吗?谢谢您的帮助。
查看完整描述

2 回答

?
www说

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切片中的元素。


查看完整回答
反对 回复 2022-01-04
?
一只名叫tom的猫

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

}


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信