从嵌套块返回,范围问题

时间:2018-07-07 15:28:28

标签: 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.Println("it matches")
        return true
    }
}

https://play.golang.org/p/x6l29CNdg-o

如何返回嵌套(甚至多次嵌套)块中满足的条件?

实际案例

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

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

3 个答案:

答案 0 :(得分:1)

修复您的编译错误:: missing return at end of function。例如,

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
}

游乐场:https://play.golang.org/p/AYj7tcXd49k

输出:

Hello, playground
it matches
isTrue is true

  

The Go Programming Language Specification

     

Return statements

     

函数F中的“返回”语句终止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
}

答案 1 :(得分:0)

检查从函数返回的值,将其分配给变量,并在检查以下条件时在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
}

If control statement的Golang有效Go中,描述如下:

  

由于and开关接受初始化语句,因此通常   请参阅用于设置局部变量的一个。

if err := file.Chmod(0664); err != nil {
    log.Print(err)
    return err
}
  

在Go库中,当if语句不存在时,您会发现   流入下一条语句-也就是说,主体以断裂结束,   继续,转到或返回-省略不必要的其他内容。

f, err := os.Open(name)
if err != nil {
    return err
}
codeUsing(f)

它还用于地图中,以根据键检查值是否存在。在地图上查看Effective Go的此链接以了解有关comma ok语法的更多信息。

工作代码已于Go playground

更新

答案 2 :(得分:0)

如果我正确理解了您的问题,这是一个一般的逻辑问题,而不是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
}