亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號