Как правильно вернуться из функции? - PullRequest
0 голосов
/ 28 сентября 2019

Я запутался, как мне вернуть значение из функции.Я пробовал следующий пример:

  • Передача false функции a
  • Значение c будет ложным в функции a
  • Это сделает рекурсивный вызов, и этоизменит значение 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)
    }
    

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

Ответы [ 3 ]

3 голосов
/ 28 сентября 2019

Ваш рекурсивный код всегда будет возвращать "ложь" ложь, если c ложно.Пожалуйста, смотрите правильный код ниже.

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)
}
0 голосов
/ 28 сентября 2019

Это приведет к двухуровневой рекурсии.На первом уровне у вас есть как ложь.Затем вы называете (true) и находитесь на втором уровне, который возвращает true.Теперь вы вернулись на уровень 1 в строке a (true), а следующая строка должна вернуть false как string и bool.Следовательно, вы получаете false в качестве конечного результата.

Я думаю, что вы пытаетесь использовать возвращаемое значение, которого сейчас нет.

0 голосов
/ 28 сентября 2019

Непонятно, что, по вашему мнению, должен делать ваш код, но вот что он на самом деле делает:

  1. Вы звоните a со значением false:

    Он проверяет, является ли c истинным:

    if c {
    

    , но это не так, поэтому он продолжает

  2. Он снова вызывает a, на этот раз со значением true, но полностью игнорируя результат:

    a(true)
    
  3. Затем возвращается false:

    return "false", false
    

Это означает, что шаг # 2это полное отсутствие операции (и, вероятно, полностью удалено компилятором).

Может быть, вы хотите что-то сделать с возвращенным значением a(true)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...