如何編寫一個包裝庫的 Go 包,以便對重寫函數的調用使用我的實現,并且非重寫函數“落入”我正在包裝的庫中?特別是:我希望我的 Go 包包裝 ,除了我最初只想替換 和 ,并保持所有其他功能相同。我的庫是現有代碼的直接替代品,它調用我不會覆蓋的其他函數。例如,我希望能夠做到:net/httphttp.FileServerhttp.NotFoundHandlernet/httppackage mainimport ( "log" http "github.com/jstrieb/my-special-http-lib")func main() { http.ListenAndServe( // Use the net/http ListenAndServe by "falling through" my library ":8080", http.FileServer(http.Dir("/usr/share/doc")) // Use my custom, overridden http.FileServer )}我嘗試過什么我可以手動覆蓋包裝庫導出的每個函數(如下所示),但如果可能的話,我寧愿避免這種情況。這種方法是不可取的,因為它沒有考慮從我正在包裝的庫中調用我覆蓋的函數的實例。func ExportedFunction(input1 type1) type2 { return http.ExportedFunction(input1)}我也可以完全分叉net/ http源代碼并直接更改它,但我希望它清楚我所做的更改,而不必與原始版本進行比較。維護標準庫的一部分分支以僅覆蓋幾個函數也是沒有意義的。理由我不是在尋找關于這是否是一個“好”想法的評論。我只想知道該怎么做。此庫的計劃是簡單地更改 404 頁面和目錄列表索引頁的外觀。這種純粹的美學變化不會影響 的基礎功能或 API。如果它的結構不是包裝所有 ,那么用戶將不得不在使用兩個包之間切換以執行相同的操作。然后,我的庫不能被視為已經使用 的代碼的“直接替換”。net/httpnet/httpnet/http我也打算隨著時間的推移覆蓋更多的函數,但我的庫的API將始終與.這樣做可以減少手動替換調用的需要,就像每次庫更改時一樣。此外,我希望能夠在我沒有編寫的代碼(使用)中導入我的替換,并且不想手動重構。net/httphttp.Functionmylibrary.Functionnet/http
2 回答

慕村225694
TA貢獻1880條經驗 獲得超4個贊
您在這里嘗試實現的是擴展包的功能。這里的簡單答案是,到目前為止,您還不能這樣做。實現這一目標的最佳方法是手動執行此操作。
就個人而言,我認為將兩個包分開沒有任何害處。我這個它更易于維護。只需包裝要更新的函數即可。有時,您所需要的只是一個函數。

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
不是 Go 專家,但從軼事上講,如果通過指定一個依賴項,然后您可以使用所需的任何修改來旁加載其不同版本,這將引入一個重大漏洞。
它可能會說出這樣一個概念,如果這個依賴關系是你可以帶入應用程序的東西,那么你應該構建一個基于你想要修改的庫的庫,并導入它。也就是說,給定您的應用程序 A 和庫 B,以及您修改后的庫 B',您可能希望編寫應用程序,以便 A 依賴于 B',而 B 依賴于 B,這將使關系變得明顯。如果你想以某種方式讓A依賴于B,但能夠動態地旁加載B',那么這將代表我之前提到的漏洞。
- 2 回答
- 0 關注
- 94 瀏覽
添加回答
舉報
0/150
提交
取消