我將如何讓程序包在加載時向注冊表注冊一些對象(例如函數),以便將新程序包添加到程序中將自動為程序添加新功能,而無需修改其他程序包中的代碼?這是一個代碼示例,該示例應說明我正在嘗試執行的操作。src / say / say.go:package mainimport ( "os" "reg")func main() { if len(os.Args) != 2 { os.Stderr.WriteString("usage:\n say <what_to_say>\n") os.Exit(1) } cmd, ok := reg.GetFunc(os.Args[1]) if ok { os.Stdout.WriteString(cmd()) os.Stdout.Write([]byte{'\n'}) } else { os.Stderr.WriteString("I can't say that!\n") os.Exit(1) }}src / reg / reg.go:package regvar registry = make(map[string]func() string)func Register(name string, f func() string) { registry[name] = f}func GetFunc(name string) (func() string, bool) { f, ok := registry[name] return f, ok}src / hi / hi.go:package hiimport ( "reg"}func init() { reg.Register("hi", func() string { return "Hello there!" })}當對此進行編碼時,我天真地假定go編譯器會找到軟件包“ hi”并將其編譯為二進制文件。然后,在加載時,init()函數將運行。如果那是這樣的話,我將能夠添加以下類似的內容以添加新的“ say no”命令:src / no / no.go:package noimport ( "reg")func init() { reg.Register("no", func() string { return "Not a chance, bub." })}但是,它似乎沒有這種方式。我可能只是通過Pythonic鏡頭來思考這個問題,但是有什么方法可以完成一些類似我要拍攝的事情嗎?如果沒有,我會改變主意,我將學到有關Go的做事方式的新知識。
- 2 回答
- 0 關注
- 320 瀏覽
添加回答
舉報
0/150
提交
取消