【问题标题】:How to create a map[string] [2]int in Go? [duplicate]如何在 Go 中创建 map[string] [2]int? [复制]
【发布时间】:2016-07-20 09:35:18
【问题描述】:

我想在 Go 中创建一个 map[string][2]int。我在去操场上尝试了this,但我遇到了错误。我该如何解决这个问题?

fmt.Println("Hello, playground")
m:= make(map [string][2]int)
m["hi"]={2,3}
m["heello"][1]=1
m["hi"][0]=m["hi"][0]+1
m["h"][1]=m["h"][1]+1
fmt.Println(m)

【问题讨论】:

    标签: arrays dictionary go


    【解决方案1】:

    看到这个问题:https://github.com/golang/go/issues/3117

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        fmt.Println("Hello, playground")
        m := make(map[string][2]int)
    
        m["hi"] = [2]int{2, 3}
    
        m["heello"] = [2]int{}
    
        var tmp = m["heello"]
        tmp[1] = 1
        m["heello"] = tmp
    
        fmt.Println(m)
    }
    

    【讨论】:

    • 谢谢,但我不想总是定义我的键,如果它们不存在,我想将它们用作默认值,例如如果 m["hi"] [0]=m ["hi"][0]+1 如果 m["hi"][0] 没有创建,那么它会自动设置为默认值 0 然后 m["hi"][0]=1跨度>
    【解决方案2】:

    您的地图初始化是正确的。 您只需要显式声明地图元素的类型:

    m:= make(map [string][2]int)
    m["test"] = [2]int{1,3}
    fmt.Println(m)
    

    如果您不需要访问底层元素,则此方法有效。

    如果你需要这个,你必须使用指针:

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        fmt.Println("Hello, playground")
        m := make(map[string]*[2]int)
        m["hi"] = &[2]int{2, 3}
        m["heello"] = &[2]int{0, 1}
        m["hi"][0] = m["hi"][0] + 1
        // commented out. Initialize it first
        //m["h"][1]=m["h"][1]+1
        fmt.Println(m) // 2 address
        fmt.Println(m["hi"], m["heello"])
    }
    

    【讨论】:

    • 您将无法通过赋值来为底层数组赋值。如果这是你需要的,你需要创建一个指针映射。
    • @nessuno 谢谢,这解决了第 10 行的第一个问题,但我还需要解决其余的问题,我需要访问数组的特定值,然后添加到它,有什么解决方案吗?
    • 我根据@Nebril 提示更新了我的答案
    【解决方案3】:

    如果您希望能够为数组索引分配值,则需要有一个指向数组的指针映射。查看此代码(您需要在将它们用作数组之前启动所有映射键)。

    package main
    
    import (
        "fmt"
    )
    
    func Assign(m map[string]*[2]int, key string, index int, value int) {
        if _, ok := m[key]; !ok {
            m[key] = &[2]int{}
        }
    
        m[key][index] = value
    }
    
    func main() {
        fmt.Println("Hello, playground")
    
        m := make(map[string]*[2]int)
    
        m["hi"] = &[2]int{2, 3}
        m["h"] = &[2]int{4, 5}
    
        //existing key
        Assign(m, "h", 1, 4)
        //new key
        Assign(m, "howdy", 1, 3)
    
        fmt.Println(m["hi"])
        fmt.Println(m["h"])
        fmt.Println(m["howdy"])
    
    }
    

    【讨论】:

    • 谢谢,但我需要在不定义键的情况下添加值,例如,如果 m["hi"] [0]=m["hi"][0]+1 和 if m[" hi"][0] 未创建,然后自动设置为默认值,即 0 然后 m["hi"][0]=1
    • @SaidSaifi 您可以将分配包装在函数中,该函数将检查密钥并在需要时创建新数组。更新了上面的代码来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多