使用功能指针作为键进行映射

彼得·霍梅尔

我最近在我的一个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需要局部变量,这是从来没有针对不同调用相同的地址AddFind当然,以下内容可能会有用:http : //play.golang.org/p/F9jyUxzJhz


如果它不是指针,那是个坏主意,因为从Go 1开始不可能实现。根据语言规范(实时演示):

必须为键类型的操作数完全定义比较运算符==和!=;因此,键类型不能为函数,映射或切片。

==!=没有为函数定义,因为比较函数是否相等的问题尚不确定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用功能指针作为方法参数

来自分类Dev

使用功能指针时,CUDA将宿主功能作为内核启动

来自分类Dev

映射功能指针

来自分类Dev

使用功能作为字典键

来自分类Dev

功能指针作为功能参数

来自分类Dev

取消引用功能指针以交换功能

来自分类Dev

智能指针作为地图键

来自分类Dev

使用功能参数值作为字典键

来自分类Dev

使用功能参数值作为字典键

来自分类Dev

通过元素指针作为键的无序映射对向量进行排序

来自分类Dev

将功能指针作为参数传递,其中功能指针的参数是功能指针参数的子代

来自分类Dev

使用成员函数指针作为键的C ++映射问题

来自分类Dev

将功能指针数组中的功能指针作为模板参数传递

来自分类Dev

功能指针-存储和使用

来自分类Dev

使用智能指针进行继承的pimpl

来自分类Dev

指向功能指针

来自分类Dev

功能指针(列表)

来自分类Dev

功能指针说明

来自分类Dev

功能指针声明

来自分类Dev

功能指针WINAPI

来自分类Dev

功能指针

来自分类Dev

功能指针(列表)

来自分类Dev

指针作为映射C ++ STL中的键

来自分类Dev

如何使用功能作为地图的关键

来自分类Dev

使用功能作为参考起点

来自分类Dev

使用功能键对 Dell Inspirion 进行延迟亮度控制 - Ubuntu 18.04

来自分类Dev

如何使用功能进行决策

来自分类Dev

使用C ++ 11智能指针作为C函数参数

来自分类Dev

使用智能指针作为全局变量