英文:
Declaring map with function pointer value in goLang
问题
我想声明一个map
,它看起来像这样,这样我就可以将各种init
函数映射到initType
:
func makeMap(){
m := make(map[initType]InitFunc)
// 这个map的值声明应该如何设置?
}
type initType int
const(
A initType = iota
B
C
D
)
type InitFunc func(initType)
func initA(aInitType initType){
doStuff(aInitType)
}
func initB(aInitType initType){
doOtherStuff(aInitType)
}
func initC(aInitType initType){
doMoreStuff(aInitType)
}
我将函数指针类型声明为InitFunc
(在示例中我称之为&InitFunc
,因为我不知道如何声明),这样我就可以将其作为Map的值使用。
英文:
I'd like to declare a map
that would that would look like this, so I could map various init
functions to 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)
}
How do I declare the function pointer type (which I called &InitFunc in the example because I don't know how to do it) so I can use it as the value in a Map?
答案1
得分: 5
与C语言不同,Go语言中实际上不需要一个“指针”来指向函数,因为在Go语言中,函数是引用类型,类似于切片、映射和通道。此外,地址运算符&会产生一个指向值的指针,但要声明指针类型,请使用*。
你似乎希望你的InitFunc接受一个InitType参数并且不返回任何值。在这种情况下,你可以这样声明它:
type InitFunc func(initType)
现在,你的映射初始化可以简单地如下所示:
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,并调用适用的函数(如果已定义)。
英文:
Unlike C, you don't actually need a "pointer" to the function, since in Go, functions are reference types, similar to slices, maps, and channels. Further, the address operator, &, produces a pointer to a value, but to declare a pointer type, use *.
You seem to be wanting your InitFunc to take a single InitType and return no values. In that case, you would declare it as:
type InitFunc func(initType)
Now, your map initialization can simply look like:
m := make(map[initType]InitFunc)
A complete example would be (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")
}
Here, it's looping through each initType, and calling the applicable function, if it is defined.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论