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