当前位置: 首页 > 面试题库 >

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

靳高明
2023-03-14
问题内容

如果我的猜测正确的话,我可能会遇到结构问题,可能还会遇到指针问题。

该结构具有一些字段和一个包含切片的字段:

type Bot struct {
    // ...
    connlist []Connection
}

Connection看起来是这样的:

type Connection struct {
    conn       net.Conn
    messages   int32
    channels   []string
    joins      int32
    connactive bool
}

我的问题是将的值更改connactivetrue

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
}

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

但是,如果以后尝试使用的方法来遍历Botconnactive则总是false出于某种原因(默认设置)。

for i := 0; i < len(bot.connlist); i++ {
        log.Println(bot.connlist[i].connactive)
}

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

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


问题答案:

您的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带索引和值(或仅带值)的with,您将观察到相同的问题(connactive将仍然存在false):

for _, v := range bot.connlist {
    bot.ListenToConnection(&v) // BAD! v is also a copy
}

因为v它也是一个副本,将其地址传递给bot.ListenToConnection(),所以它只会指向副本,而不是connlist切片中的元素。



 类似资料:
  • 问题内容: 假设,我运行一个API,并且当用户在用户资源上发出GET请求时,我将以JSON的形式返回相关字段 如您所见,User中的Secret字段具有。这意味着在大多数操作中,我都不想返回。在这种情况下,响应将是 忽略该字段将不会返回该字段机密。 现在,我将打开一个我想返回秘密字段的管理员专用路由。但是,这将意味着复制User结构。 我当前的解决方案如下所示: 有没有一种方法可以将User嵌入a

  • 问题内容: 我有一个RegistrationRequest结构: 再次在哪里输入电子邮件值,以验证用户输入的内容正确无误。 我也有一个用户结构: 当然,没有必要存储超出注册的范围。 所以我有两个变量:和-每个结构一个。是否可以将结构分配给该结构,以便所有公共字段都将存在于该结构中? 问题答案: 使用简单分配,您不能这样做,因为即使的字段是的子集,它们也完全是2种不同的类型,并且可分配性规则不适用。

  • 问题内容: 我有两个具有以下结构的json文件 和 如您所见,json和演员表的内部结构相同。我想将这些json文件解编为相同的golang结构。但是我不能为相同的struct元素提供两个名称标签(广播和电影)。我想要类似的东西 在这种情况下,Detail可以同时解析演员和电影。 这是我当前的代码 但它仅适用于第一个标签“ cast”,并在json包含电影的情况下给出nill。 提前致谢。 问题答

  • 我有一个由3个orgs和两个频道组成的网络。

  • 问题内容: 我正在尝试在结构内使用slice chan类型,类似于下面的代码。但是,当我尝试接收 程序挂起。有没有办法做到这一点? 问题答案: goroutine中的第一行从通道接收,创建goroutine之后的main中的第一行也是如此。这意味着系统中仅有的两个goroutine都试图从slice通道接收,而没有人试图发送到其中。 更一般而言,问题是要使某人接收(消费),其他人必须同时发送(产生

  • 问题内容: 我对结构字段有疑问。 我已经创建了一个类与一种方法即增加或减少对象变量通过。另一种方法用于输出结果。 在一个新的实例与默认创建和,然后我打电话和。我希望在期间更改的值并产生,但它显示的是: 我的代码有什么问题? 问题答案: 您需要在此处使用指针,否则每次都仅更改原始对象的副本。一切都通过价值传递。