登录
首页 >  Golang >  Go问答

枢轴图反转不会恢复正确的值

来源:stackoverflow

时间:2024-04-15 16:36:38 167浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《枢轴图反转不会恢复正确的值》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

扩展 https://github.com/golang/go/issues/39242 ...

我尝试通过附加外部切片来展平内部切片,然后反转通过附加内部切片来展平外部切片的输出

https://play.golang.org/p/2tubtql5uwb

package main

import (
    "fmt"
)

func main() {
    inner := make([]interface{}, 0)
    inner = append(inner, map[string]interface{}{"id": "1"})
    inner = append(inner, map[string]interface{}{"id": "2"})
    inner = append(inner, map[string]interface{}{"id": "3"})

    outer := make([]interface{}, 0)
    outer = append(outer, map[string]interface{}{"id": "a", "inner": inner})
    fmt.println(outer)

    // flatten inner slice into 1 level
    pivotinners := make([]interface{}, 0)
    for _, itemouter := range outer {
        itemoutermap := itemouter.(map[string]interface{})
        innerslice := itemoutermap["inner"].([]interface{})
        delete(itemoutermap, "inner")
        for _, iteminner := range innerslice {
            iteminnermap := iteminner.(map[string]interface{})
            iteminnermap["outer"] = itemoutermap
            pivotinners = append(pivotinners, iteminner)
        }
    }
    fmt.println(pivotinners)

    // flatten outer slice to 1 level
    pivotouters := make([]interface{}, 0)
    for _, pivotinner := range pivotinners {
        pivotinnermap := pivotinner.(map[string]interface{})
        outerx := pivotinnermap["outer"].(map[string]interface{})
        delete(pivotinnermap, "outer")

        // dump row
        outerx["inner"] = pivotinnermap
        fmt.println(outerx)

        pivotouters = append(pivotouters, outerx)
    }

    // dump collection
    fmt.println(pivotouters)
}

内部切片

map[id:1]
map[id:2]
map[id:3]

外切片

[map[id:a inner:[map[id:1] map[id:2] map[id:3]]]]

内枢轴

[map[id:1 outer:map[id:a]] map[id:2 outer:map[id:a]] map[id:3 outer:map[id:a]]]

我期待着

外枢轴

[map[id:a inner:map[id:1]] map[id:a inner:map[id:2]] map[id:a inner:map[id:3]]]

但得到了

外枢轴

如果我回显内行,它会返回正确的值

map[id:a inner:map[id:1]]
map[id:a inner:map[id:2]]
map[id:a inner:map[id:3]]

但是追加后,切片只得到最后一行

[map[id:A inner:map[id:3]] map[id:A inner:map[id:3]] map[id:A inner:map[id:3]]]

有人知道吗?


解决方案


解决方案是添加一个副本,这样每个内部地图就不会引用相同的外部地图。

https://play.golang.org/p/lwVuvTuwVVc

package main

import (
    "fmt"
)

func main() {
    inner := make([]interface{}, 0)
    inner = append(inner, map[string]interface{}{"id": "1"})
    inner = append(inner, map[string]interface{}{"id": "2"})
    inner = append(inner, map[string]interface{}{"id": "3"})

    outer := make([]interface{}, 0)
    outer = append(outer, map[string]interface{}{"id": "a", "inner": inner})
    fmt.println(outer)

    // flatten inner slice into 1 level
    pivotinners := make([]interface{}, 0)
    for _, itemouter := range outer {
        itemoutermap := itemouter.(map[string]interface{})
        innerslice := itemoutermap["inner"].([]interface{})
        delete(itemoutermap, "inner")
        for _, iteminner := range innerslice {
            iteminnermap := iteminner.(map[string]interface{})
            outercopy := make(map[string]interface{}, len(itemoutermap))
            for k,v := range itemoutermap {
                outercopy[k] = v
            }
            iteminnermap["outer"] = outercopy
            pivotinners = append(pivotinners, iteminner)
        }
    }
    fmt.println(pivotinners)

    // flatten outer slice to 1 level
    pivotouters := make([]interface{}, 0)
    for _, pivotinner := range pivotinners {
        pivotinnermap := pivotinner.(map[string]interface{})
        outerx := pivotinnermap["outer"].(map[string]interface{})
        delete(pivotinnermap, "outer")

        // dump row
        outerx["inner"] = pivotinnermap
        fmt.println(outerx)

        pivotouters = append(pivotouters, outerx)
    }

    // dump collection
    fmt.println(pivotouters)
}

输出

map[id:A inner:map[id:1]]
map[id:A inner:map[id:2]]
map[id:A inner:map[id:3]]
[map[id:A inner:map[id:1]] map[id:A inner:map[id:2]] map[id:A inner:map[id:3]]]

感谢https://github.com/200sc在slack上回答问题!

以上就是《枢轴图反转不会恢复正确的值》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>