文章目录
(一)for 循环
Go只有一个循环结构就是for循环,for循环有3个被分号分割的组成部分,分别是:
1,初始化语句
2,条件表达式
3,后声明语句
所在位置情况是:for 初始化语句;条件表达式;后声明语句
for循环的初始化语句是短变量声明,并且这个变量声明的作用域只在for循环语句中,当循环迭代的判断条件变为false后将会停止,不像C,Java,Js等语言的循环语句总是需要带上括号 (),在Go中可以不写括号
package main
import "fmt"
func main(){
var sum int = 0
for i:=0 ; i < 50 ; i++ {
sum+=i
}
fmt.Println("从0累加到49后的值为:",sum)
}
(二)for循环知识扩展
在for循环中,初始化值和后声明语句可以不写,比如
for ;i<10; { }
package main
import "fmt"
func main(){
res := 10
for ;res<11; {
res *= res
}
fmt.Println(res)
}
(三)for就是Go的while循环
去掉分号的for循环就是go的while循环,和c的while循环效果是相似的
package main
import "fmt"
func main(){
res := 10
for res<100 {
res+=10
}
fmt.Println("res经过while循环后的结果为:",res)
}
(四)死循环
如果for不设置循环条件,循环将会一直持续下去变成死循环
package main
import "fmt"
func main(){
for {
}
}
死循环导致运行超时
(五)if 语句
if 语句有些像for循环,表达式也不需要括号圆包括,但是花括号是必须的
package main
import (
"fmt"
"math"
)
func calcNum(x float64) float64 {
if x > 0 {
return math.Sqrt(x * 10)
}
return math.Sqrt(x)
}
func main() {
fmt.Println("\n计算的平方根为:", calcNum(20), "\n")
}
(六)if 短声明
像 for 一样,if 声明可以在条件之前执行短声明,短声明的变量的作用域仅仅直到 if 结束
package main
import (
"fmt"
)
func kok(x, y, con float64) float64 {
if v := x + y; v == con {
return v
}
return con
}
func main() {
fmt.Println(
kok(1, 2, 3),
"\n",
kok(10, 23, 2),
"\n",
)
}
(七)if…else 语句
变量可以在if 模块里面进行短声明,也可以在else 里面进行短声明
package main
import(
"fmt"
"math"
)
func Alo(v int){
if v := math.Sqrt(v);v > 30{
fmt.Println("您的值求平方根后大于30得:",v)
}else {
math.Pow(v,v)
fmt.Println("您的值求平方根后小于30,根据else选择我们选择求平方,结果为:",v)
}
}
func main(
Alo(10)
fmt.Printf()
)
(七)switch 选择语句
switch是一种用较短的方法去写if-else的声明的方法,在Go语言中,swtich同样没有括号判断,也没有case判断后的break关键字,case判断完成后会自动跳出switch选择 ,终止整个swicth
package main
import (
"fmt"
"runtime"
)
func main(){
switch os := runtime.GOOS; os{
case "darwin":
fmt.Println("您使用的操作系统为OS X.")
case "windows":
fmt.Print("您使用的操作系统为Windows")
case "Linux":
fmt.Print("您使用的操作系统为Linux")
default :
fmt.Print("您使用的操作系统为os")
}
}
使用switch配合runtime进行操作系统的信息检测
(八)switch 无条件选择
switch选择不设置条件就相当于switch为true,case结构就会变成if-else的模式
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
fmt.Printf("当前时间为:%v", t)
switch {
case t.Hour() > 10 && t.Hour() < 22:
fmt.Println("当前时间位于10点-22点")
case t.Hour() >= 22:
fmt.Println("已经22点以后了,夜已深,早点休息")
}
}
(九)defer
defer 关键字的使用可以是一个函数被延迟,直到被延迟函数的周围函数都执行完
package main
import "fmt"
func main(){
defer fmt.Println("你好!")
fmt.Println("还行!")
}
如果有多个defer定义,顺序该怎么执行?
如果存在多个defer,执行顺序为从后到前,谁最先被defer定义, 谁就最后输出
前看演示:
package main
import "fmt"
func main() {
fmt.Println("0!")
defer fmt.Println("1!")
defer fmt.Println("2!")
defer fmt.Println("3!")
fmt.Println("4!")
}
输出结果为:0,4,3,2,1
以上示例说明 Go的defer会造成一个堆栈的后进先出(last-in-first-out)顺序,再看一个实例演示便更理解这种顺序
package main
import "fmt"
func main(){
for i := 0;i < 10 ;i++ {
defer fmt.Print("当前是第",i,"个数")
}
fmt.Print("开始数数!")
}