Flow control statements: for, if, else, switch and defer
5 分钟阅读
Flow control statements: for, if, else, switch and defer
For
https://go.dev/tour/flowcontrol/1
Go 只有一个循环结构:for
循环。
基本的for循环由三个部分组成,它们用分号隔开:
- 初始化语句:在第一次迭代前执行
- 条件表达式:在每次迭代前进行求值
- 后置语句:在每次迭代的结尾执行。
初始化语句通常是一个短变量声明,其中声明的变量只在for语句的作用域中可见。
一旦条件表达式求值为false
,循环迭代将停止。
注意:与其他语言如C、Java或JavaScript不同的是,for
语句的三个部分没有小括号,大括号{ }
总是必需的。
|
|
For continued - for (续)
https://go.dev/tour/flowcontrol/2
初始化语句和后置语句都是可选的。
|
|
For is Go’s “while”
https://go.dev/tour/flowcontrol/3
此时,您可以放弃分号。C的while
在Go中叫做for
。
|
|
Forever 无限循环
https://go.dev/tour/flowcontrol/4
如果您省略了循环条件,它就会永远循环下去。因此无限循环可以写得很紧凑。
|
|
If
https://go.dev/tour/flowcontrol/5
Go的if
语句与它的for
循环类似;表达式不需要
用小括号()
包围,但需要
用大括号{}
。
|
|
If with a short statement - if 的简短语句
https://go.dev/tour/flowcontrol/6
和for
一样,if
语句可以在条件表达式之前执行一个简短语句。
该语句所声明变量的作用域仅在if
之内。
(尝试在最后的return
语句中使用v
)。
|
|
If and else
https://go.dev/tour/flowcontrol/7
在if
简短语句中声明的变量也可以
在任何对应的else
块中使用。
(对pow
的两次调用都在main
中对fmt.Println
的调用开始之前返回其结果)。
|
|
Exercise: Loops and Functions 练习:循环和函数
https://go.dev/tour/flowcontrol/8
为了练习函数和循环,我们来实现一个平方根函数:给定一个数字x
,我们想找到z²
最接近x
的数字z
。
计算机通常使用循环来计算x
的平方根。从某个猜测的z
开始,我们可以根据z²
与x
的接近程度来调整z
,产生一个更好的猜测:
z -= (z*z - x) / (2*z)
重复这种调整使猜测越来越精确,直到我们得到一个尽可能接近实际平方根的答案。
在提供的函数Sqrt
中实现这一点。无论输入什么,对z
的一个合适的起始猜测是1
。首先,重复计算10
次,并打印每次的z
值。观察对于不同的x
值(1,2,3,……),您得到的答案是如何接近结果的,以及猜测提升的速度有多快。
提示:要声明和初始化一个浮点值,要给它以浮点的语法或使用转换:
|
|
接下来,修改循环条件,一旦数值停止变化(或者只变化了很小的量)就停止。观察迭代次数多于还是少于10次。尝试其他的z
的初始猜测,比如x
,或者x/2
。您的函数的结果与标准库中的math.Sqrt
有多接近?
(注:如果您对算法的细节感兴趣,上面的z²-x
是指z²
到它所要到达的值(即x)的距离,除以2z
为z²
的导数,以缩放我们通过z²
的变化速度调整z
的程度。这种一般方法被称为牛顿法。它对许多函数都很有效,但对平方根尤其有效)。
|
|
Switch
https://go.dev/tour/flowcontrol/9
switch
语句是写一连串if-else
语句的一种更简短的方式。它运行第一个值等于条件表达式的case
语句。
Go的switch
与C、C++、Java、JavaScript和PHP中的switch
一样,只是Go只运行选定的case
,而不是之后的所有情况。实际上,Go中是自动提供了在这些语言中每个case结尾所需的break语句。【除非在每个case语句结尾加上 fallthrough
,否则case 分支会自动终止】。另一个重要的区别是,Go的switch
的 case
无需是常量,且值也不必是整数。
|
|
Switch evaluation order
https://go.dev/tour/flowcontrol/10
switch
的 case
语句从上到下顺序执行,直到匹配成功时停止。
(例如:
|
|
在 i == 0
时,f
不会被调用。)
Note: Time in the Go playground always appears to start at 2009-11-10 23:00:00 UTC, a value whose significance is left as an exercise for the reader.
注意:Go练习场上的时间总是从2009-11-10 23:00:00 UTC
开始,这个数值的意义留给读者发现。
|
|
Switch with no condition 没有条件的 switch
https://go.dev/tour/flowcontrol/11
没有条件的switch
和switch true
是一样的。
这种形式能将一长串的if-then-else
写得更加简洁。
|
|
Defer
https://go.dev/tour/flowcontrol/12
defer
语句将一个函数的执行推迟到外层函数返回的最后执行。
推迟调用的函数的参数会被立即求值,但直到外层函数返回之前,该函数都不会被调用。
|
|
Stacking defers
https://go.dev/tour/flowcontrol/13
推迟的函数调用被压入一个栈中。当外层函数返回时,被推迟的函数会按照后进先出的顺序调用。
要了解更多关于defer
语句的信息,请阅读这篇博文。
|
|
Congratulations!
https://go.dev/tour/flowcontrol/14
您完成了这一课!
您可以回到模块
列表中寻找下一步要学习的内容,或者继续学习下一课。