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

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

在 Go 中使用遞歸引用

在 Go 中使用遞歸引用

Go
繁星coding 2021-07-03 07:15:26
我想在一個映射中包含我的所有命令,并從命令映射到一個執行工作的函數(只是一個標準的調度表)。我從以下代碼開始:package mainimport "fmt"func hello() {    fmt.Print("Hello World!")}func list() {    for key, _ := range whatever {        fmt.Print(key)    }}var whatever = map[string](func()) {    "hello": hello,    "list": list,}但是,它無法編譯,因為函數和結構之間存在遞歸引用。嘗試向前聲明函數失敗,并在定義時出現有關重新定義的錯誤,并且映射位于頂級。你如何定義這樣的結構并在頂層初始化它們而不必使用init()函數。我在語言定義中沒有看到好的解釋。存在的前向引用用于“外部”函數,當我嘗試前向聲明函數時它不會編譯。我也沒有辦法提前聲明變量。更新:我正在尋找一種解決方案,它不需要您在啟動程序或init()函數時顯式填充變量。不確定這是否可行,但它適用于我所知道的所有可比語言。更新 2: FigmentEngine提出了一種方法,我在下面給出了答案。它可以處理遞歸類型,還允許對所有命令的映射進行靜態初始化。
查看完整描述

3 回答

?
江戶川亂折騰

TA貢獻1851條經驗 獲得超5個贊

您可能已經發現,Go 規范聲明(我的重點):

如果 A 的初始化器依賴于 B,則 A 將設置在 B 之后。 依賴分析不依賴于被初始化項的實際值,只依賴于它們在源中的出現。如果 A 的值包含對 B 的提及、包含一個其初始值設定項提及 B 的值或遞歸提及提及 B 的函數,則 A 依賴于 B 。如果這種依賴形成一個循環,則是錯誤的。

所以,不,不可能做你想做的事。問題 1817提到了這個問題,Russ Cox 確實說 Go 中的方法有時可能會過度限制。但它很清楚且定義明確,并且可以使用變通方法。

因此,繞過它的方法仍然是使用init(). 對不起。


查看完整回答
反對 回復 2021-07-05
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

只需在使用之前在函數內填充地圖list()。像那樣。

Sry 我沒有看到你寫了“沒有init()”:那是不可能的。



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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