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

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

將對返回值直接傳遞給另一個函數

將對返回值直接傳遞給另一個函數

Go
jeck貓 2022-05-18 17:06:36
我調用一個返回一對的函數(在示例 os.Open 中),我想將返回的對作為參數直接傳遞給另一個函數(不使用中間變量)。我嘗試了以下兩種方法,均未成功。其他語言(如 F#)允許對函數調用執行模式匹配。我怎樣才能在 Go 中達到同樣的效果?func checkError(f *os.File, e error, m string) interface{} {    if e != nil {        /*Print m and panic*/    }    return f}func f1(path string) {    checkError(os.Open(path), "Can't Open File") //ERROR}func checkError((f *os.File, e error), m string) interface{} { //ERROR    if e != nil { /*Print m and panic*/}    return f}func f1(path string) {    checkError(os.Open(path), "Can't Open File")}
查看完整描述

3 回答

?
慕姐4208626

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")


查看完整回答
反對 回復 2022-05-18
?
胡說叔叔

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")

 } 


查看完整回答
反對 回復 2022-05-18
?
慕碼人8056858

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")

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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