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

时间:2019-09-28 14:57:15

标签: go recursion

我很困惑如何从函数返回值。我正在尝试以下示例:

  • 将false传递给功能a
  • 函数a中c的值将为假
  • 它将进行递归调用,这会将c的值从false更改为true
  • 因此函数应返回字符串“ true”和布尔值true,但它返回字符串“ false”和布尔值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)
    }
    

    https://play.golang.org/p/uSIN2k0G3QW

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

尚不清楚您认为代码应该做什么,但这是它的实际作用:

  1. 您用值a呼叫false

    它检查c是否为真:

    if c {
    

    但不是,所以继续

  2. 它再次调用a,这次使用值true,但完全忽略了结果:

    a(true)
    
  3. 然后返回false:

    return "false", false
    

这意味着第2步是完全禁止操作的操作(可能已被编译器完全删除)。

也许您想对返回的值a(true)做些什么?

答案 2 :(得分:0)

这将导致2级递归。在第一级中,您将c设置为false。然后,您调用a(true),您进入了返回true的第二级。现在您回到第1层的a(true)行,下一行将作为字符串和布尔返回false。因此,最终输出为false。

我认为您正在尝试使用返回值,而现在并非如此。