Go 从函数返回的正确方法是什么?

Go 从函数返回的正确方法是什么?,go,recursion,Go,Recursion,我不知道如何从函数返回值。我正在尝试以下示例: 将false传递给函数a 函数a中的c值将为false 它将进行递归调用,这将c的值从false更改为true 所以函数应该返回字符串true和bool true,但它返回的是字符串false和bool false package main import ( "fmt" ) func a(c bool) (string, bool) { if c { return "true", true } a

我不知道如何从函数返回值。我正在尝试以下示例:

将false传递给函数a 函数a中的c值将为false 它将进行递归调用,这将c的值从false更改为true 所以函数应该返回字符串true和bool true,但它返回的是字符串false和bool false

package main

import (
    "fmt"
)

func a(c bool) (string, bool) {
    if c {
        return "true", true
    }
    a(true)
    return "false", false
}

func main() {
    s, ok := a(false)
   fmt.Println(s, ok)
}

不清楚您认为您的代码应该做什么,但下面是它实际做的:

调用值为false的:

它检查c是否为真:

但它不是,所以它继续

它再次调用,这次值为true,但完全忽略结果:

a(true)
然后返回false:

return "false", false
这意味着步骤2是一个完全的no-op,可能会被编译器完全删除


也许您想对atrue的返回值做些什么?

这将导致2级递归。在第一级中,c为false。然后你调用一个函数,你进入了第二级,返回true。现在您回到了第1级的atrue行,下一行将返回false作为string和bool。因此,最终输出为false


我认为您正在尝试使用返回值,但目前情况并非如此。

当c为false时,您的递归代码将始终返回false。请参阅下面的正确代码

package main

import (
    "fmt"
)

func a(c bool) (string, bool) {
    if c {
        return "true", true
    }
    return a(true)
}

func main() {
    s, ok := a(false)
   fmt.Println(s, ok)
}

你为什么认为你会改变c的值?代码中的任何内容都不会更改该值。同时,对a的调用也会被完全忽略。@Flimzy函数a应该返回true,true,但它返回false,false。所有人都想知道为什么你认为它应该回归真实?只有当c为true时,它才会返回true。如果c为false,那么它再次调用a,忽略结果,然后返回false。
package main

import (
    "fmt"
)

func a(c bool) (string, bool) {
    if c {
        return "true", true
    }
    return a(true)
}

func main() {
    s, ok := a(false)
   fmt.Println(s, ok)
}