
上QQ阅读APP看书,第一时间看更新
4.2 if语句
Go语言中的if
语句和其他语言中的if
语句十分相似。完整的使用示例参见示例4-5。
示例4-5:if-else

当运行这段代码,由于
math/rand
中默认的随机数seed是硬编码数,所以n的值一直是1,在9.3.5节中,我们将介绍一个生成随机数的更好的办法,同时还会学到如何处理包名冲突的情况。
Go语言和其他语言中的if
语句之间最明显的区别是不需要在条件两端加上括号。但是Go语言的if
语句还有一个特性,可以帮助我们更好地管理if
语句。
正如我们在4.1.1节中谈到的,所有在if
或else
语句代码块中声明的变量仅在其作用域中使用,大多数语言中都是如此。Go添加了新特性使声明的变量在条件从句和if-else
代码块中都可以使用。我们用这个方式重写之前的示例,如示例4-6所示。
示例4-6:if
语句中的变量作用域

具有这样的特殊作用域确实很方便。它可以使得创建的变量只存在于if-else
语句的作用域内,一旦if-else
语句结束,n
就是未定义的。你可以在The Go Playground(https://oreil.ly/rz671)中运行示例4-7。
示例4-7:超出作用域

运行以上代码会产生一个编译错误:

理论上,可以在
if
语句中的比较语句之前使用任何简单的语句,包括函数调用不返回值或不给现有变量赋值。不过仍建议在if-else
语句的作用域内声明新变量时不使用函数给已经声明的变量赋值,尽管这样做不会产生编译错误,但是会降低代码的可读性,让人难以理解。
而且需要注意,if
语句的代码块中声明的变量一样会被其内部代码块中声明的同名变量覆盖。