我最近在我的一个golang项目中使用了一个地图,该地图具有如下功能指针作为键:
map[*functiontype] somestructtype
我的一位同事说这是个坏主意,所以现在我不确定这是否可行。我最初认为还可以,因为可以检查方法指针是否相等并且是不可变的。有人可以就此事提供一些推理吗?
完整的例子:
package main
import "fmt"
type s struct {
string
}
type f func() string
func func1() string { return "func 1" }
func func2() string { return "func 2" }
func main() {
// make two functions and two pointers to them
f1, f2 := func1, func2
p1, p2 := (*f)(&f1), (*f)(&f2)
// make a map of their function pointers
m := make(map[*f]s)
m[p1] = s{"struct 1"}
m[p2] = s{"struct 2"}
// print out the mapping
printmapping(m, p1, p2)
// reverse the pointers and have that printed
p1, p2 = (*f)(&f2), (*f)(&f1)
printmapping(m, p1, p2)
}
func printmapping(m map[*f]s, p1, p2 *f) {
fmt.Println("pointer 1:", m[(*f)(p1)])
fmt.Println("pointer 2:", m[(*f)(p2)])
}
如果键类型是指向函数类型的指针(例如*func()
),则表示它很好,并且语义符合预期:相等的指针等于键。
但是,在地图中查找值可能不符合您的预期:example。这里&f
需要局部变量,这是从来没有针对不同调用相同的地址Add
和Find
。当然,以下内容可能会有用:http : //play.golang.org/p/F9jyUxzJhz
如果它不是指针,那是个坏主意,因为从Go 1开始不可能实现。根据语言规范(实时演示):
必须为键类型的操作数完全定义比较运算符==和!=;因此,键类型不能为函数,映射或切片。
==
并!=
没有为函数定义,因为比较函数是否相等的问题尚不确定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句