3 回答

TA貢獻1852條經驗 獲得超7個贊
允許這樣做會導致模棱兩可的行為;但您可以關閉最后一個參數并返回部分應用的函數:
func checkError(m string) func(*os.File, error) {
return func(f *os.File, e error) {
if e != nil {
// do stuff with m
}
}
checkError("Can't Open File")(os.Open(path))
或者,反過來:
func checkError(f *os.File, e error) func(string) {
return func(m string) {
if e != nil {
// do stuff with m
}
}
checkError(os.Open(path))("Can't Open File")

TA貢獻1804條經驗 獲得超8個贊
我發現它有點不一致,因為以下工作正常,但是當添加額外的位置參數時,編譯器不喜歡它。
func checkError(f *os.File, e error) interface{} {
if e != nil {
/*Print m and panic*/
}
return f
}
func f1(path string) {
checkError(os.Open(path)) //ERROR
}
顯然你可以直接推送返回值,不確定你會損失多少,因為如果錯誤不是零,你會驚慌失措
func checkError(f *os.File, e error, m string) interface{} {
if e != nil {
/*Print m and panic*/
}
return f
}
func f1(path string) {
file, e := os.Open(path)
checkError(file, e, "Can't Open File")
}
另一個想法是你可以傳遞函數并完成工作checkError
type OsFunction func(string)(* os.File, error)
func checkError(osFunction OsFunction, path string, m string) interface{} {
f, e := osFunction(path)
if e != nil {
/*Print m and panic*/
}
return f
}
func f2(path string) {
checkError2(os.Open, path, "Can't Open File")
}

TA貢獻1803條經驗 獲得超6個贊
我記得函數也可以返回。以下解決方案對我有用
func checkError(r interface{}, e error) func(string) interface{} {
return func(m string) interface{} {
if e != nil {
/*Print m and panic*/
}
return r
}
}
func f1(path string) {
checkError(os.Open(path))("Can't open file")
}
- 3 回答
- 0 關注
- 208 瀏覽
添加回答
舉報