为了账号安全,请及时绑定邮箱和手机立即绑定

将对返回值直接传递给另一个函数

将对返回值直接传递给另一个函数

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 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信