前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 中 能否将 slice 作为 map 的 key?

Golang 中 能否将 slice 作为 map 的 key?

作者头像
LinkinStar
发布2023-10-18 14:21:35
2430
发布2023-10-18 14:21:35
举报
文章被收录于专栏:LinkinStar's Blog

前言

最近好忙,也好久没水 Golang 的文章了,最近来水一些。说回今天的问题,这个问题非常简单,也能被快速验证。

Golang 中 能否将 slice 作为 map 的 key?

如果你现实中使用过,那么这个问题对于你来说其实意义不大,因为不行就是不行,可以就是可以。

如果你完全没这样使用过 map,那么这个问题对于你来说可能就有意义了。

思路

  1. 首先这个问题的思路在于能否作为 key 的条件是什么?
  2. key 在 map 中的作用是标记一个 kv,我们需要用 key 去查找对应的 value
  3. 那么我怎么知道,一个输入的 key 是否在这个 map 中呢?答案是比较
  4. 所以只要这个 key 能比较,说白了就是能使用 “==” 进行比较,大概率就没有问题

所以其实,这个问题的本质是:“slice 能否进行比较?”

答案

答案显然是不能的,因为 slice 是不能使用 “==” 进行比较的,所以是不能做为 map 的 key 的。 而官方文档中也说明了 https://go.dev/blog/maps

As mentioned earlier, map keys may be of any type that is comparable. The language spec defines this precisely, but in short, comparable types are boolean, numeric, string, pointer, channel, and interface types, and structs or arrays that contain only those types. Notably absent from the list are slices, maps, and functions; these types cannot be compared using ==, and may not be used as map keys.

所以如果真的需要以 slice 类似的数据来作为 key,你需要使用 array 而不是 slice,如下:

代码语言:javascript
复制
package main

import (
    "fmt"
)

func main() {
    var a, b [1]int
    a = [1]int{1}
    b = [1]int{2}
    m := make(map[[1]int]bool)
    m[a] = true
    m[b] = true

    for i := 0; i < 3; i++ {
        fmt.Println(m[[1]int{i}])
    }
}

那么只要数组中的每个对应下标元素相等,则 key 相等

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 思路
  • 答案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档