私はGOプログラミングの初心者です。ここではシナリオがある: - :私は構造にこのデータを非整列化していますGolang Function地図で呼び出し
{
"template": "linuxbase1",
"checkname": ["check_disk"],
"checkmethod": ["check_disk"]
}
: - -
package func1
import (
"io/ioutil"
"os"
"encoding/json"
"fmt"
)
type pluginfunc func() string
type Plugindata struct {
Template string `json:"template"`
Checkname []string `json:"checkname"`
Checkmethod []pluginfunc `json:"checkmethod"`
}
var (
Templatepath = "json_sample1.json"
Templateitems Plugindata
)
func Gettemplatedata() {
tdata, err := ioutil.ReadFile(Templatepath)
if err != nil {
fmt.Printf("Unable to read file %s. Error - %v\n",Templatepath, err.Error())
os.Exit(3)
}
json.Unmarshal(tdata, &Templateitems)
}
"check_disk" 機能がある
は次のようになりますJSONファイルが存在しますここに: - :
-package func1
func check_disk() string {
return "Called check_disk"
}
これは、メイン()を持つプログラムです
package main
import (
"fmt"
"checksexpt/func1"
)
func main() {
func1.Gettemplatedata()
fmt.Printf("Templateitems in Main() => %v\n",func1.Templateitems)
for index,funcname := range func1.Templateitems.Checkmethod {
fmt.Printf("%d = %s\n",index,funcname())
}
}
予想通り、私はmain()を実行します。私はエラーが表示されます: -
Templateitems in Main() => {linuxbase1 [check_cpu check_disk] [<nil> <nil>]}
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x40115e]
goroutine 1 [running]:
panic(0x50e980, 0xc82000a100)
/opt/go/src/runtime/panic.go:481 +0x3e6
私はJSONファイルから文字列をつかみ、それを関数呼び出しとして扱おうとしています。それは明らかに失敗する!しかし、ここでの主な制約は、JSONファイルから関数名を選ぶ必要があることです。これどうやってするの ?私は次のように私は、静的なマップを作成することができることを知っている: -
type checkfunc func() string
var (
Templateitems = map[string]map[string]checkfunc {
"linuxbase1": {
"check_disk": check_disk,
},
}
)
だから、のような呼び出し - Templateitems["linuxbase1"]["check_disk"]()
がうまく動作します。しかし、私はマップの要素が増え続ける必要があるので、そのような静的マップを作成したくありません。これに関するアイデア?