Go 从嵌套块返回,范围问题 基本概念

Go 从嵌套块返回,范围问题 基本概念,go,scope,Go,Scope,我正在学习Go,但我不知道如何从函数的内部块返回数据 package main import ( "fmt" ) func main() { fmt.Println("Hello, playground") if isTrue("asasa") { fmt.Println("isTrue is true") } } func isTrue(s string) bool { if s == "asasa" { fmt.P

我正在学习Go,但我不知道如何从函数的内部块返回数据

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, playground")
    if isTrue("asasa") {
        fmt.Println("isTrue is true")
    }
}

func isTrue(s string) bool {
    if s == "asasa" {
        fmt.Println("it matches")
        return true
    }
}
如何返回嵌套甚至多次嵌套块中满足的条件

真实案例场景 我收到一个h、c、L值的三元组,我想检查它是否与我之前存储其他三元组的2D切片唯一。
我循环遍历所有三元组,如果存在匹配,我希望isUnique返回false,否则返回true

检查函数返回的值,将其分配给变量,并在检查以下条件时在main中使用: 包干管

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, playground")
    if ok := isTrue("asasa"); ok {
        fmt.Println("isTrue is true")
    }
}

func isTrue(s string) bool {
    boolean := false
    for i := 0; i < 5; i++ {
        if s == "asasa" {
            fmt.Println("it matches")
            boolean = true
        }
    }
    return boolean
}
在Go库中,您会发现如果if语句不 流到下一个语句,即主体以break结尾, 继续、转到或返回省略了不必要的else

在映射中,它还用于根据键检查值是否存在。查看此链接以了解有关逗号ok语法的更多信息

上更新的工作代码修复编译错误::函数末尾缺少返回。比如说,

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, playground")
    if isTrue("asasa") {
        fmt.Println("isTrue is true")
    }
}

func isTrue(s string) bool {
    if s == "asasa" {
        fmt.Println("it matches")
        return true
    }
    return false
}
游乐场:

输出:

Hello, playground
it matches
isTrue is true
函数F中的return语句终止F的执行

对于您刚才添加的真实案例:

func isUnique(h, c, L float64) bool {
    for i, color := range usedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        }
    }
    return true
}

如果我正确理解了您的问题,这是一个一般的逻辑问题,而不是golang问题或从块返回。您的代码存在问题:

func isUnique(h, c, L float64) bool {
    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        } else {
            return true
        }
    }
}
它只检查第一种颜色,而不是所有颜色。您真正想要的是首先检查它们是否匹配

    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        }
    }
只有当它们都不匹配时,才返回true

func isUnique(h, c, L float64) bool {
    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        }
    }
    return true
}

非常感谢,我很抱歉,我承认这是一个愚蠢的问题,但在有效的围棋和围棋之旅中,这些技巧根本没有解释。您是否有机会提出较低级别的go文档建议?解决方案和逗号ok方法仅对1级嵌套块有效,但是,将if封装在一个中断中,以便再次完成整个过程。我想了解如何从无限或至少几个嵌套块返回。很抱歉,我不得不取消接受asnwer。@Maxiride ok检查我编辑的答案中的if语句。请编辑您的文章以获取更多信息,这样我将尝试了解您到底想要从代码中得到什么side@Maxiride您可以创建一个默认值为false的变量,然后在您的条件满足的地方更改它,这将帮助您只编写return语句once@Maxiride返回值是在您的条件下工作的正确方法。如果你的函数有一个return,我真的不理解这个问题,就返回吧。如果我在函数关闭之前添加了一个简单的return,这是一个编译错误,因为它需要一个bool,而不是由return生成的,那么就返回一个bool。但是,这并不能回答如何从多个嵌套块返回。我不应该做那个简单的例子,因为它会使答案产生偏差。@Maxiride:我已经在我的答案中添加了你的新例子。所以在这种情况下,if中的内部返回也起到了中断的作用?@Maxiride:是的。return语句充当函数级中断。无论嵌套的深度如何,它都会退出函数。请参阅我的答案中要返回的引用。
func isUnique(h, c, L float64) bool {
    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        } else {
            return true
        }
    }
}
    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        }
    }
func isUnique(h, c, L float64) bool {
    for i, color := range usuedColors {
        if color[0] == h && color[1] == c && color[2] == L {
            fmt.Println("This color already exist!")
            return false
        }
    }
    return true
}