第二节
循环语句
在GO里面 ,只有for这个关键词来表示循环结构
格式一:和C里的for循环类似,但是省略了 ()
package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
也可以这么写
package main
import "fmt"
func main() {
sum := 1
for ; sum < 1000; {
sum += sum
}
fmt.Println(sum)
}
格式二:将 for当做while来使用
package main
import "fmt"
func main() {
sum := 1
for sum < 1000 {
sum += sum
}
fmt.Println(sum)
}
无限循环 如果你省略了循环条件,则会进入无限循环
package main
func main() {
for {
}
}
判断语句
if判断语句
格式一: if 条件 { }
package main
import (
"fmt"
"math"
)
func sqrt(x float64) string {
if x < 0 {
return sqrt(-x) + "i"
}
return fmt.Sprint(math.Sqrt(x))
}
func main() {
fmt.Println(sqrt(2), sqrt(-4))
}
格式二:if 声明语句 ; 条件 { }
这个声明的变量 只在 if 的结构体内有效
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
格式三: if 声明语句 ; 条件 { } else { }
这个声明的变量 在else中也可以用
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
} else {
fmt.Printf("%g >= %g\n", v, lim)
}
// can't use v here, though
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
选择语句
switch
GO的switch 其实就算一种 if-else 语句的缩写形式
它跟 C,C++,JAVA里的switch 很相似,但也有不同:
go里的switch 只会运行被选中的那条语句,而不像C 里面会运行被选中语句后的所有语句。所以不需要break
同时 最重要的一点是 case 不需要是一个常量,值也可以不只是数字
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}
switch 是从上到下去寻找的。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("When's Saturday?")
today := time.Now().Weekday()
switch time.Saturday {
case today + 0:
fmt.Println("Today.")
case today + 1:
fmt.Println("Tomorrow.")
case today + 2:
fmt.Println("In two days.")
default:
fmt.Println("Too far away.")
}
}
不带条件的switch语句
不写条件,则默认为条件是 true ,这是一种简洁的方法 去实现 if-then-else
package main
import (
"fmt"
"time"
)
func main() {
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
}
延迟语句
defer 语句
延迟函数的执行,直到函数里其他部分执行完了,
如果有多个延迟的部分,那么会从下往上执行延迟的部分。
因为defer 部分会依次放入栈中。所以是先进后出
package main
import "fmt"
func main() {
defer fmt.Println("world2")
defer fmt.Println("world1")
fmt.Println("test")
fmt.Println("hello")
fmt.Println("hfdasf")
}//结果 test hello hfdasf world1 world2
package main
import "fmt"
// defer放入栈中
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}