go - 变量镜像其他

标签 go

所以我创建了一个简单的聊天机器人,但我在使用其中一个命令 /resetall 时遇到了问题。它应该将每个用户的值更改为用户“默认”的值。但是,默认值似乎导致所有值都更改 2。

"data": {
    "user": {
        "bob": {
            "admin": "true",
            "consecutiveCommands": "0",
            "nickname": "", 
            "sentMessages": "2" 
        },  
        "default": {
            "admin": "true",
            "consecutiveCommands": "0",
            "nickname": "", 
            "sentMessages": "2" 
        },  
        "me": {
            "admin": "true",
            "consecutiveCommands": "0",
            "nickname": "", 
            "sentMessages": "2" 
        },  
        "total": {
            "admin": "true",
            "consecutiveCommands": "0",
            "nickname": "", 
            "sentMessages": "2" 
        }   
    },  
    "chat": {
        "commandSender": "me",
        "lastImage": "", 
        "lastMessage": "/pong",
        "lastSender": "me",
        "lastTimestamp": "11:59",
        "wasCommand": "true"
    }
}

和我的代码:

// each incoming message
type Message struct {
        Message   string
        From      string
        Chat      string
        Timestamp string
        IsCommand bool
}
//adds one to a string
func addOne(s string) string {
        i, _ := strconv.Atoi(s)
        return strconv.Itoa(i + 1)
}
//counts messages sent
func messageCounter(data map[string]Chat, event *Message) map[string]Chat {
        //counts messages sent by user
        data[event.Chat].Data.User[event.From]["sentMessages"] = addOne(data[event.Chat].Data.User[event.From]["sentMessages"])
        data[event.Chat].Data.User["total"]["sentMessages"] = addOne(data[event.Chat].Data.User["total"]["sentMessages"])
        return data
}
//sets variables for future use / other functions
func eventRecorder(data map[string]Chat, event *Message) map[string]Chat {
        if !event.IsCommand {
                data[event.Chat].Data.Chat["lastMessage"] = event.Message
                data[event.Chat].Data.Chat["lastSender"] = event.From
                data[event.Chat].Data.Chat["lastTimestamp"] = event.Timestamp
                data[event.Chat].Data.Chat["wasCommand"] = "false"
        } else {
                data[event.Chat].Data.Chat["wasCommand"] = "true"
                data[event.Chat].Data.Chat["commandSender"] = event.From
        }
        return data
}
//supposed to set all users data to the default user
func resetall(event *Message, data map[string]Chat) (error, map[string]Chat) {
        default_user := data[event.Chat].Data.User["default"]
        if data[event.Chat].Data.User[event.From]["admin"] == "true" {
                for user, _ := range data[event.Chat].Data.User {
                        if user != "default" {
                                data[event.Chat].Data.User[user] = default_user
                                print(user + "\n")
                        }   
                }   

                return nil, data
        }   
        return errors.New("don't have permission")), data
}
func main() {
        processingFuncs := []func(map[string]Chat, *Message) map[string]Chat{
                messageCounter,
                eventRecorder,
        }   
        data, _ := readsettings() //reads the data from a json file
        event := &Message{"/resetall", "me", "chat123", "11:59", false}
        if strings.Split(event.Message, " ")[0] == "/resetall" {
                event.IsCommand = true
                _, data = resetall(event, data)
                fmt.Println("success")
        }   
        for _, processingFunc := range processingFuncs {
                processingFunc(data, event)
        }   
        writesettings(data) //writes the data to a json file
}

因此,如果我将每个人的消息计数器设置为 0 并运行它,它会将每个用户的消息计数器设置为 2(包括默认值)。每次我运行它时,该值都会增加 2。任何人都可以帮助解释为什么会发生这种情况

最佳答案

这一行复制用户

data[event.Chat].Data.User[user] = default_user

对它做了一个引用,我不知道为什么我没有早点发现它。我用这段代码替换了它

for k, v := range data[event.Chat].Data.User["default"] {
    data[event.Chat].Data.User[user][k] = v 
} 

而且效果很好。

关于go - 变量镜像其他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702012/

相关文章:

go - `sync.WaitGroup` 的方法集是什么?

templates - Golang 模板引擎管道

go - 从包导入路径获取包源的完整路径

go - 如何从 Go 服务器在浏览器中下载文件

go - Go 中具有作用域的多组 const 名称

go - 运行测试时“无法创建临时输出文件”

go 变量作用域和阴影

go - 从 goroutine 中的缓冲 channel 读取时的执行顺序

go - mutex 的 golang 实现中是否存在竞争条件 m.state 是在没有原子函数的情况下读取的

go - 在 Iris Framework 的 POST 方法中重定向