Pointers 作为映射键的接口

Pointers 作为映射键的接口,pointers,dictionary,go,Pointers,Dictionary,Go,在以下代码中: package main import ( "fmt" ) type Object interface { String() string } type Person struct { Name string } func (p *Person) String() string { return fmt.Sprintf("person: %s", p.Name) } func main() { dict := map[Object]int{

在以下代码中:

package main

import (
  "fmt"
)

type Object interface {
  String() string
}

type Person struct {
  Name string
}

func (p *Person) String() string {
  return fmt.Sprintf("person: %s", p.Name)
}

func main() {
  dict := map[Object]int{
    &Person{Name: "xyz"}: 4,
    &Person{Name: "gle"}: 2,
    &Person{Name: "kp3"}: 7,
  }

  fmt.Println(dict[&Person{Name: "xyz"}])
}
它只打印
0
,因为地图的键是
对象,它们是接口。我知道为什么会发生这种情况,但有什么办法可以避免吗?我希望能够有一个映射,其键是接口类型,但我仍然可以访问其字段


到目前为止,我想到的唯一方法是迭代每个键,并检查该键是否与我正在搜索的东西相等,但速度可能会明显减慢。

这似乎是对地图的滥用;如果要为对象的
String()
值设置贴图的关键帧(对象唯一的共同点),可以尝试:

package main

import (
    "fmt"
)

type Object interface {
    String() string
}

type Person struct {
    Name string
}

func (p *Person) String() string {
    return fmt.Sprintf("person: %s", p.Name)
}

func main() {
    xyz := &Person{Name: "xyz"}
    gle := &Person{Name: "gle"}
    kp3 := &Person{Name: "kp3"}
    dict := map[string]int{
        xyz.String(): 4,
        gle.String(): 2,
        kp3.String(): 7,
    }

    fmt.Println(dict[xyz.String()])
}

这似乎是对地图的滥用;如果要为对象的
String()
值设置贴图的关键帧(对象唯一的共同点),可以尝试:

package main

import (
    "fmt"
)

type Object interface {
    String() string
}

type Person struct {
    Name string
}

func (p *Person) String() string {
    return fmt.Sprintf("person: %s", p.Name)
}

func main() {
    xyz := &Person{Name: "xyz"}
    gle := &Person{Name: "gle"}
    kp3 := &Person{Name: "kp3"}
    dict := map[string]int{
        xyz.String(): 4,
        gle.String(): 2,
        kp3.String(): 7,
    }

    fmt.Println(dict[xyz.String()])
}

如果在结构而不是指针上定义方法,则它确实有效:

如果你不能在真实的代码中做到这一点,恐怕你无法实现你想要的。这两个指针将是不同的值,即使它们指向相似的数据


您可以将
Equals(Object)bool
方法添加到
Object
界面,并推出自己的映射实现。或者,您可以定义
Hash()string
方法并使用
map[string]无论什么

如果您在结构而不是指针上定义方法,它都会起作用:

如果你不能在真实的代码中做到这一点,恐怕你无法实现你想要的。这两个指针将是不同的值,即使它们指向相似的数据


您可以将
Equals(Object)bool
方法添加到
Object
界面,并推出自己的映射实现。或者,您可以定义
Hash()string
方法,并使用
map[string]无论什么

这看起来都是可能的-您实际想要实现什么?地图键通常只是键,如果你需要从它们到界面类型的行为,你可能需要考虑一种不同的方法。我的键是接口类型的原因是因为我正在制作一种语言,程序可以在其中制作地图。键和值都是同一类型的:一个对象。这并不意味着解释器应该使用Go
map
s来实现该语言的映射。是的,但似乎要实现我自己的映射类型需要付出很多努力。编写一个语言解释器。这看起来是一个可能的方法-你到底想实现什么?地图键通常只是键,如果你需要从它们到界面类型的行为,你可能需要考虑一种不同的方法。我的键是接口类型的原因是因为我正在制作一种语言,程序可以在其中制作地图。键和值都是同一类型的:一个对象。这并不意味着解释器应该使用Go
map
s来实现该语言的映射。是的,但实现我自己的映射类型似乎需要很多努力。编写一个语言解释器。好主意,但我必须更改很多代码才能使其工作。好主意,但是为了让它工作,我必须修改很多代码。我可能会实现我自己的映射。我可能会实现我自己的映射。