如果我的猜测正确的话,我可能会遇到结构问题,可能还会遇到指针问题。
该结构具有一些字段和一个包含切片的字段:
type Bot struct {
// ...
connlist []Connection
}
这Connection
看起来是这样的:
type Connection struct {
conn net.Conn
messages int32
channels []string
joins int32
connactive bool
}
我的问题是将的值更改connactive
为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
。
有任何想法吗?谢谢您的帮助。
您的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通道接收,而没有人试图发送到其中。 更一般而言,问题是要使某人接收(消费),其他人必须同时发送(产生
问题内容: 我对结构字段有疑问。 我已经创建了一个类与一种方法即增加或减少对象变量通过。另一种方法用于输出结果。 在一个新的实例与默认创建和,然后我打电话和。我希望在期间更改的值并产生,但它显示的是: 我的代码有什么问题? 问题答案: 您需要在此处使用指针,否则每次都仅更改原始对象的副本。一切都通过价值传递。