为什么在" if"中使用语句?声明?

时间:2014-06-19 23:47:20

标签: if-statement go

Go tour显示了一个例子,他们在与&#34相同的行中有一个额外的声明;如果"声明,他们解释如下:the if statement can start with a short statement to execute before the condition.

func pow(x, n, lim float64) float64 {
    if v := math.Pow(x, n); v < lim {
        return v
    }
    return lim
}

我不认为需要这种语法,并且发现它非常令人困惑。为什么不在上一行写v := math.Pow(x, n)

我问的原因是,对于我发现的内容,语法经过仔细考虑后会进入Go语言,并且似乎没有任何想法。

我想我的实际问题是:他们试图通过使用这种语法来解决什么具体问题?使用以前没有的东西可以获得什么?

2 个答案:

答案 0 :(得分:6)

有许多用例,我不认为此功能可以解决特定问题,但对于在Go中编码时遇到的一些问题,这是一个实用的解决方案。语法背后的基本意图是:

  • 正确的范围:仅为变量提供所需的范围
  • 正确的语义:明确表示变量只属于代码的特定条件部分

我记得的一些例子:

范围有限

if v := computeStuff(); v == expectedResult {
    return v
} else {
    // v is valid here as well
}

// carry on without bothering about v

检查错误

if perr, ok := err.(*os.PathError); ok {
    // handle path error specifically
}

或更一般,类型检查

if someStruct, ok := someInterface.(*SomeStruct); ok {
    // someInterface is actually a *SomeStruct.
}

地图中的密钥检查

if _, ok := myMap[someKey]; ok {
    // key exists
}

答案 1 :(得分:2)

因为您的变量包含在范围内 请注意,那些v在不同的范围内声明。

了解范围的更直接的示例:http://play.golang.org/p/fInnIkG5EH

package main

import (
    "fmt"
)

func main() {
    var hello = "Hello"

    {
        hello := "This is another one"
        fmt.Println(hello)
    }

    if hello := "New Hello"; hello != ""{
       fmt.Println(hello)
    }

    fmt.Println(hello)
}