map - 在goLang中用函数指针值声明映射

标签 map go function-pointers

我想声明一个看起来像这样的 map,这样我就可以将各种 init 函数映射到 initType:

func makeMap(){

    m := make(map[initType]&InitFunc)
    //How should the value declaration be set up for this map?

}


type initType int 

const(
    A initType = iota
    B
    C
    D
)


func init(aInitType initType){
    doStuff(aInitType)

}


func init(aInitType initType){
    doOtherStuff(aInitType)

}


func init(aInitType initType){
    doMoreStuff(aInitType)

}

如何声明函数指针类型(我在示例中将其称为 &InitFunc,因为我不知道该怎么做)以便我可以将其用作 Map 中的值?

最佳答案

与 C 不同,您实际上不需要指向函数的“指针”,因为在 Go 中,函数是引用类型,类似于 slice 、映射和 channel 。此外,地址运算符 & 生成指向值的指针,但要声明指针类型,请使用 *。

您似乎希望您的 InitFunc 采用单个 InitType 并且不返回任何值。在这种情况下,您可以将其声明为:

type InitFunc func(initType)

现在,您的 map 初始化可以简单地看起来像:

m := make(map[initType]InitFunc)

一个完整的例子是(http://play.golang.org/p/tbOHM3GKeC):

package main

import "fmt"

type InitFunc func(initType)
type initType int

const (
    A initType = iota
    B
    C
    D
    MaxInitType
)

func Init1(t initType) {
    fmt.Println("Init1 called with type", t)
}

var initFuncs = map[initType]InitFunc{
    A: Init1,
}

func init() {
    for t := A; t < MaxInitType; t++ {
        f, ok := initFuncs[t]
        if ok {
            f(t)
        } else {
            fmt.Println("No function defined for type", t)
        }
    }
}

func main() {
    fmt.Println("main called")
}

在这里,它循环遍历每个 initType,并调用适用的函数(如果已定义)。

关于map - 在goLang中用函数指针值声明映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21417175/

相关文章:

scala - Scala 中的 'yield' 是否等同于 map 函数?

java - 当通过 Map.put(K, V) 添加一个值时,必须通过 Map.get(K) 返回相同的实例吗?

java - 如何从 OpenStreetMap 离线创建 map 图 block ,在 Android 上显示?

amazon-web-services - 如何使用 Go 在 AWS S3 中设置 If-Modified-Since header

c++ - 如何将 C++ 函数指针作为带有一些固定值的参数传递?

java - 我可以在 Java 中使用键-键映射(而不是键-值)吗?

debugging - 戈朗 : Cannot get gdb working for Go programs using C libraries

postgresql - 如何从函数(存储过程)中获取 INPUT 值?与 golang

c++ void *到函数的参数

c++ - 如何在需要自由函数的地方传递成员函数?