pointers - 使用嵌套映射复制结构

标签 pointers go reference

<分区>

我想做什么?

在需要时将“默认”结构复制到一个新结构中,并保留其所有值。

详情

我正在尝试复制一个 Chat 结构:

type ChatData struct {
        User map[string]map[string]string `json:"user"`
        Chat map[string]string            `json:"chat"`
}
type Chat struct {
        Settings map[string]map[string]interface{} `json:"settings"`
        Data     ChatData                          `json:"data"`
}

我只需要在引入新聊天时执行此操作,并检查 map[string]Chat 中的成员资格。

//data is a map[string]Chat
if _, exists := data[event.Chat]; !exists {
        data[event.Chat] = data["default"]
}

完整的默认结构是:

{
    "default": {
        "settings": {
            "eightball": {
                "messages": [
                    "yes",
                    "no",
                    "maybe"
                ]   
            },  
            "main": {
                "blacklistedCommands": [], 
                "blacklistedUsers": [], 
                "error": "there was an error - ",
                "maxConsecutive": 5,
                "permissions": "You don't have permissions for that command.",
                "success": "The command was successful.",
                "whitelistedCommands": [], 
                "whitelistedUsers": []
            }   
        },  
        "data": {
            "user": {
                "default": {
                    "admin": "false",
                    "consecutiveCommands": "0",
                    "nickname": "", 
                    "sentMessages": "0" 
                },  
                "total": {
                    "admin": "false",
                    "consecutiveCommands": "0",
                    "nickname": "", 
                    "sentMessages": "0" 
                }   
            },  
            "chat": {
                "commandSender": "", 
                "lastMessage": "", 
                "lastSender": "", 
                "lastTimestamp": "", 
                "wasCommand":""
            }
        }
    }
}

我尝试了什么

data[event.Chat] = data["default"]
// causes a reference

data[event.Chat] = &data["default"]
// cannot use &data["default"] (type *Chat) as type Chat in assignment

data[event.Chat] = *data["default"]
// invalid indirect of data["default"] (type Chat)

我是否需要将我对 map[string]Chat 的使用更改为 map[string]*Chat 并使用第二个选项?指针和引用不是我的专长,因此不胜感激。

编辑

谁以为我在抄 map ,你在抽什么烟?

最佳答案

我在以前的案例中发现,复制复杂结构的一种简单(虽然不是最有效)的方法是对其进行编码,然后将其解编为一个新变量。这可以通过多种编码来完成。两个简单的(包含在标准库中)是 json 和 gob。

还有很多库使用反射来实现类似的目标:https://github.com/jinzhu/copier

但是就像我说的,虽然效率不高,但这很容易推理并且只需要一个简单的函数就可以实现。如果性能很重要,你应该更喜欢 gob 而不是 json。如果性能真的很重要,那么您应该更喜欢另一种解决方案。

关于pointers - 使用嵌套映射复制结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49723427/

相关文章:

c++ - Iterator increment results 是一个新的迭代器吗?

node.js - 如何修复 NodeJS 未充分利用 CPU 内核?

angularjs - AngularJS的Gorilla CSRF

C++ 未定义对带有队列参数的函数的引用

c++ - 为什么 set/get_default_resource 使用指针而不是引用?

c - OpenGL:根据 C 语言改编的红皮书示例进行不稳定渲染

c - Mmap和结构

c++ - 调用 get 后将 shared_ptr 分配给另一个

javascript - 在两个 Web Worker 中具有相同的 WebAssembly 实例

c++ - Rust 中指针和引用的区别