2014-01-28 75 views
2

函數指針值聲明地圖,我想聲明map會會這個樣子,這樣我就可以各種init功能映射到initType在goLang

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中的值?

+2

你只需要做'map [initType] func(initType)' – Arjan

回答

2

與C不同,實際上並不需要指向函數的「指針」,因爲在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,並調用適用的函數(如果已定義)。

+0

Tnx - 對於GoLang中什麼是引用類型和值類型等,仍然有點困惑。這看起來不錯。 – Vector