如何在加載時向註冊表註冊某個對象(例如函數)以便向程序添加新程序包時會自動爲程序添加新功能,而無需修改其他程序包中的代碼?Go的下載包?
下面是一個代碼示例,它應該說明我正在嘗試做什麼。
的src /說/ say.go:
package main
import (
"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 reg
var 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.go:
package hi
import (
"reg"
}
func init() {
reg.Register("hi", func() string {
return "Hello there!"
})
}
當編碼這個,我天真地認爲,可能編譯到二進制文件中的程序包「hi」會被編譯器找到。然後,在加載時,init()函數將運行。如果是這樣的事情是如何工作的,我已經能夠在東西砸像下面添加一個新的「說不」的命令:
的src /沒有/ no.go:
package no
import (
"reg"
)
func init() {
reg.Register("no", func() string {
return "Not a chance, bub."
})
}
但,它似乎並沒有這樣工作。
我可能只是通過一個Pythonic鏡頭來思考這個問題太多了,但是有什麼辦法可以完成某些事情嗎?如果沒有,我會改變我的方針,並且我會學到一些關於Go方式的新東西。
在此先感謝!
太棒了。這正是我所期待的。事後看來,我應該自己想到這個。但請注意一點。我認爲你仍然需要在「cmds」導入之前加下劃線,否則你會得到一個導入的和未使用的錯誤。即進口(_「cmds」)。 – AntiMS
很高興我能幫到你。你說得對。我編輯了答案並添加了下劃線。 – ANisus