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

我调用一个返回一对的函数(在示例 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")

}

http://img3.mukewang.com/6284b7330001626606040284.jpg

http://img2.mukewang.com/6284b73d0001478405930249.jpg

jeck猫
浏览 174回答 3
3回答

慕姐4208626

允许这样做会导致模棱两可的行为;但您可以关闭最后一个参数并返回部分应用的函数: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")

胡说叔叔

我发现它有点不一致,因为以下工作正常,但是当添加额外的位置参数时,编译器不喜欢它。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") } 

慕码人8056858

我记得函数也可以返回。以下解决方案对我有用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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go