亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go中的嵌入式程序包?

Go中的嵌入式程序包?

Go
慕娘9325324 2021-05-09 13:18:49
我將如何讓程序包在加載時向注冊表注冊一些對象(例如函數),以便將新程序包添加到程序中將自動為程序添加新功能,而無需修改其他程序包中的代碼?這是一個代碼示例,該示例應說明我正在嘗試執行的操作。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 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

根據我對init函數的了解,我認為您的示例只要將“ hi”和“ no”添加到要導入的軟件包列表中,就可以使用say.go。如果這樣做是行得通的嗎?

我知道您不想更改中的代碼say.go,因此我認為這并不是真正的解決方案。


查看完整回答
反對 回復 2021-05-17
  • 2 回答
  • 0 關注
  • 320 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號