【问题标题】:Golang equivalent of hashcode() and equals() method [duplicate]Golang等效于hashcode()和equals()方法[重复]
【发布时间】:2018-03-27 21:57:37
【问题描述】:

我已经开始使用 Golang 并且知道自定义结构可以用作地图中的键。但我想知道是否可以明确指定我的映射如何区分键(类似于我们使用 hashcode() 和 equals() 的 Java)。假设我们有:

type Key struct {
   Path, Country string
}

如果我想指定只使用 struct Key 的 Path 属性来区分映射中的键,我该怎么做?

【问题讨论】:

  • 试试这个? stackoverflow.com/questions/24534072/… 请在这个网站上搜索一下。很有可能,您的问题之前可能已经得到解答。否则,欢迎来到 SO!
  • 如果只希望Path 用于区分映射中的键,Path 不应该是键而不是结构吗?

标签: go


【解决方案1】:

映射键可以是任何可比较的类型。语言规范对此进行了精确定义,但简而言之,可比较的类型是布尔、数字、字符串、指针、通道和接口类型,以及仅包含这些类型的结构或数组。列表中明显没有切片、映射和函数。这些类型不能使用 == 进行比较,也不能用作映射键。 https://blog.golang.org/go-maps-in-action

但是你可以实现 hashCode(),它以 struct 作为参数并返回字符串。然后将此字符串用作映射中的键。

例如:

type Key struct {
  Path, City, Country string
}

func (k Key) hashCode() string {
   return fmt.Sprintf("%s/%s", k.Path, k.City) //omit Country in your hash code here
}


func main(){
  myMap := make(map[string]interface{})

  n := Key{Path: "somePath", City:"someCity", Country:"someCountry"}
  myMap[n.hashCode()] = "someValue"
}

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2011-08-08
    相关资源
    最近更新 更多