我有一個簡單的方法將字串寫入檔案,如下所示:
type IFile interface {
WriteString(s string) (n int, err error)
}
func writeStrToFile(createFile func(string) (IFile, error), data string) {
file, _ := createFile(getFilePath())
file.WriteString(data)
}
假設getFilePath()回傳當前作業系統的有效檔案路徑字串
我嘗試writeStrRefreshTokenToFile()使用以下方法呼叫該函式:
writeStrToFile(os.Create, "DATA")
據我了解,os.Create的回傳方法簽名func(name string) (*os.File, error)應該滿足writeStrToFile的引數型別要求,func(string) (IFile, error)因為*os.File應該是介面的有效實作IFile。但是,在實作中我得到一個 IncompatibleAssign 錯誤。為什么是這樣?
背景關系:
最終,我正在嘗試為此函式撰寫單元測驗,以便我可以預期createFile()andWriteString()函式被正確呼叫。我是 Go 新手,所以我可能只是在處理這個錯誤,不需要對函式的實作進行如此徹底的測驗。但是,由于沒有回傳值,否則該函式似乎是不可測驗的
uj5u.com熱心網友回復:
錯誤訊息告訴您 atype func(name string) (*os.File, error)不能用作type func(string) (IFile, error). 函式簽名是不同的:*os.File并且IFile是不同的型別。
假設 Go 像你預期的那樣作業,還有另一個問題。該程式泄漏從回傳的檔案描述符os.Create。
構造代碼的另一種方法是這樣的:
func writeStrToFile(writeFile func(name string, data []byte, perm FileMode) error, data string) {
writeFile(getFilePath(), []byte(data), 0666)
}
通常這樣稱呼它:
writeStrToFile(os.WriteFile, "DATA")
將 os.WriteFile 替換為另一個函式進行測驗。
uj5u.com熱心網友回復:
問題是:
當你需要定義函式簽名時,所有的引數和回傳型別應該完全一樣
函式()A!=函式()B
即使 B 是 A 實作的介面。型別別名例外。
快速解決方案是添加一個包裝器以從一種型別轉換為另一種
wrapper := func(path string) (IFile, error){
return createFile(path)
}
f, err := wrapper(…)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453006.html
