如何解决如何维护一组整数序列?
set := make(map[string]bool)
set["Foo"] = true
foo_exists := set["Foo"]
如果我们想要一组整数序列怎么办? Go 编译器为 Invalid key type []int
抱怨 make(map[[]int]bool)
。
Set 是一种常用的基本数据类型,有很多用途。例如,可以在密码生成/破解程序中使用一组整数序列来记录已生成/尝试过的密码。这使程序能够快速查找生成/尝试过的密码,以避免再次生成/尝试密码。这种数据结构非常基础,应该会在各种应用程序中不时使用。
解决方法
正如@Wishwa Perera 的回答中所解释的,不可比较的类型不能用作映射键。因此您可以编码,或将不同类型转换为您的 int slices
,然后插入到地图中。
在下面的示例中,我将 int 切片转换为字符串并插入到地图中。但这对 long int 切片不利,因为 string 变得越来越长,运行代码花费的时间也越来越多。
您可以使用散列来解决该问题。
package main
import (
"fmt"
)
type intArray []int
func (i intArray) toString() string{
return fmt.Sprintf(`%+v`,i)
}
func main() {
myMap := make(map[string]bool)
arr1 := []int{1,2,3,4}
myMap[intArray(arr1).toString()] = true
arr2 := []int{1,4}
arr2Exist := myMap[intArray(arr2).toString()]
fmt.Println(`is array 2 exist : `,arr2Exist) //is array 2 exist : true
arr3 := []int{1,4,5}
arr3Exist := myMap[intArray(arr3).toString()]
fmt.Println(`is array 3 exist : `,arr3Exist) //is array 3 exist : false
}
您可以运行 here
,映射键可以是任何可比较的类型。其中一些是:
- 布尔值
- 数字
- 字符串
- 指针
- 频道
- 接口类型
- Structs——如果它的所有字段类型都具有可比性
- Array – 如果数组元素的值类型具有可比性
一些不可比较且不能用作映射中键的类型是:
- 切片
- 地图
- 功能
您使用的是切片,而是使用数组,将大小(假设为 5)定义为 make(map[[5]int]bool)
并且它会编译。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。