Dictionary 围棋:从地图上弹出

Dictionary 围棋:从地图上弹出,dictionary,go,Dictionary,Go,是否有一个现有的函数可以在GO中从映射中弹出(键、值)对?我使用pop这个词而不是remove,因为pop会在索引(key,value)被删除之后重新排列元素 以下代码作为示例: package main import "fmt" func main() { mapp := make(map[int]int) fmt.Println("before removal:") for i := 1; i < 7; i++ { mapp[i] = i

是否有一个现有的函数可以在GO中从映射中弹出(键、值)对?我使用pop这个词而不是remove,因为pop会在索引(key,value)被删除之后重新排列元素

以下代码作为示例:

package main

import "fmt"

func main() {
    mapp := make(map[int]int)
    fmt.Println("before removal:")

    for i := 1; i < 7; i++ {
        mapp[i] = i
    }
    fmt.Println(mapp)
    delete(mapp, 2)
    fmt.Println("\nafter the removal:")
    for i := 1; i < 7; i++ {
        fmt.Println(i, mapp[i])
    }

}
我们注意到索引位置2是空的。我希望输出如下:

before removal:
map[1:1 2:2 3:3 4:4 5:5 6:6]

after the removal:
1 1
2 3
3 4
4 5
5 6
此功能是否已在Go中,或者我必须实现它?

来自:

当使用范围循环在映射上迭代时,不会指定迭代顺序,也不能保证从一次迭代到下一次迭代的顺序相同。

因此,无法自动将值向上移动一个位置以填补空白,因为每次查看值时,键可能位于不同的迭代位置,并且无法保证映射到
2
的值将向上滑动到
1

如果要执行类似操作,必须手动将所有内容向下移动一个键值,例如:

for key := 2; key < len(map)-1; key++ {
    map[key] = map[key+1]
}
从:

当使用范围循环在映射上迭代时,不会指定迭代顺序,也不能保证从一次迭代到下一次迭代的顺序相同。

因此,无法自动将值向上移动一个位置以填补空白,因为每次查看值时,键可能位于不同的迭代位置,并且无法保证映射到
2
的值将向上滑动到
1

如果要执行类似操作,必须手动将所有内容向下移动一个键值,例如:

for key := 2; key < len(map)-1; key++ {
    map[key] = map[key+1]
}

我认为您误解了
地图是什么以及它是如何工作的。您不应该将其视为“带间隙的阵列”,而应该将其视为经典

为了回答您的问题,当您使用
delete()
时,值将从
映射中删除,问题是如何迭代映射的“值”

为了帮助您理解:

mapp := make(map[int]int)
fmt.Println(2, mapp[2])
将打印

2 0
1 1
3 3
4 4
5 5
6 6
为什么??因为当请求的键不存在时,我们得到值类型的零值。在本例中,值类型为int,因此零值为0

因此,在打印之前,您希望查看地图中是否存在一个键,并且必须使用双值赋值,如下所示:

for i := 1; i < 7; i++ {
    if value, exists := mapp[i]; exists {
        fmt.Println(i, value)
    }
}
这并不是你想要的,但是你可以用
map
s直接接近它。 您可以查看更多信息和示例


如果你真的想拥有一个可以删除值的数组,请参考Verran的答案,改用切片。

我认为你误解了
映射是什么以及它是如何工作的。您不应该将其视为“带间隙的阵列”,而应该将其视为经典

为了回答您的问题,当您使用
delete()
时,值将从
映射中删除,问题是如何迭代映射的“值”

为了帮助您理解:

mapp := make(map[int]int)
fmt.Println(2, mapp[2])
将打印

2 0
1 1
3 3
4 4
5 5
6 6
为什么??因为当请求的键不存在时,我们得到值类型的零值。在本例中,值类型为int,因此零值为0

因此,在打印之前,您希望查看地图中是否存在一个键,并且必须使用双值赋值,如下所示:

for i := 1; i < 7; i++ {
    if value, exists := mapp[i]; exists {
        fmt.Println(i, value)
    }
}
这并不是你想要的,但是你可以用
map
s直接接近它。 您可以查看更多信息和示例


如果您真的想要一个可以删除值的数组,请参阅Verran的答案,并改用切片。

您要求每次“弹出”时更改映射的整个键:值关系。使用地图作为基础数据结构肯定不是正确的方法。听起来可能你要求的列表可以删除随机项并保持排序(或者保持其原始顺序,即使这不是排序顺序)。不过,我还不确定你想要它做什么。如果您发布了一个关于您尝试执行的一般任务的更高级别的问题(即关于问题而不是关于建议的解决方案),我们可能可以添加一些有用的内容。您要求地图的整个键:值关系在每次“弹出”时都发生更改。使用地图作为基础数据结构肯定不是正确的方法。听起来可能你要求的列表可以删除随机项并保持排序(或者保持其原始顺序,即使这不是排序顺序)。不过,我还不确定你想要它做什么。如果您发布了一个关于您尝试执行的一般任务的更高级别的问题(即关于问题而不是关于建议的解决方案),我们可能会添加一些有用的内容。