// go 中只有for循环这一种循环结构 // 初始化语句:在第一次迭代前执行 // 条件表达式:在每次迭代前求值 // 后置语句:在每次迭代的结尾执行 funcmain(){ sum := 0 for i := 0; i < 10; i++{ sum += i } fmt.Println(sum) // 初始化语句和后置语句是可选的 sum = 1 for ; sum < 1000 ; { sum += sum } fmt.Println(sum) // 上面的去掉分号,就是go中的for循环 sum = 1 for sum < 1000 { sum += sum } fmt.Println(sum)
// 无限循环, 省略循环条件
// for {
// }
}
判断
package main
import ( "fmt" "math" )
funcsqrt(x float64)string { // 可以省略() if x < 0 { return sqrt(-x) + "i" } return fmt.Sprint(math.Sqrt(x)) }
funcpow(x, n, lim float64)float64 { // if 可以在条件表达式之前执行一个简单的语句 if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %g\n", v, lim) } // 这里开始就不能使用 v 了 return lim }
funcmain() { fmt.Println(sqrt(2), sqrt(-4))
fmt.Println( pow(3, 2, 10), pow(3, 3, 20), ) }
循环和函数练习
package main
import ( "fmt" )
funcSqrt(x float64)float64 { z := 1.0 for i := 0; i < 10; i++ { z -= (z * z - x) / (2 * z) fmt.Println(z) } return z; }
funcmain() { fmt.Println(Sqrt(4)) }
switch
package main
import ( "fmt" "runtime" "time" )
funcmain() { 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.\n", os) }
// switch中的case语句从上到下执行,直到匹配成功停止 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相当于 switch true 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
package main
import"fmt"
funcmain() {
fmt.Println("counting")
for i := 0; i < 10; i++ { // defer 会将函数压入栈中,外层函数返回后依次出栈执行 defer fmt.Println(i) }
fmt.Println("done")
// defer会将函数推迟到外层函数返回之后在执行
defer fmt.Println("world")
fmt.Println("hello")
}
指针
package main
import"fmt"
funcmain() { i, j := 42, 2701
p := &i // 指向 i fmt.Println(*p) // 通过指针读取 i 的值 *p = 21// 通过指针设置 i 的值 fmt.Println(i) // 查看 i 的值
funcPic(dx, dy int) [][]uint8 { ans := make([][]uint8, dy) for i := range ans { ans[i] = make([]uint8, dx) for j := range ans[i] { ans[i][j] = (uint8)((i + j) / 2) } } return ans }
funcmain() { pic.Show(Pic) }
映射
类似于键值对
package main
import"fmt"
type Vertex struct { Lat, Long float64 }
var m map[string]Vertex
// 映射的文法与结构体相似,不过必须有键名。 // 结构体在初始化的时候字段可以省略 var n = map[string]Vertex{ "Bell Labs": Vertex{ 40.68433, -74.39967, }, "Google": Vertex{ 37.42202, -122.08408, }, }
funcmain() { r := strings.NewReader("Hello, Reader!")
b := make([]byte, 8) for { n, err := r.Read(b) fmt.Printf("n = %v err = %v b = %v\n", n, err, b) fmt.Printf("b[:n] = %q\n", b[:n]) if err == io.EOF { break } } }
练习
package main
import ( "io" "os" "strings" )
type rot13Reader struct { r io.Reader }
func(rot13 rot13Reader) Read(b []byte) (int, error) { n, err := rot13.r.Read(b) for i := 0; i < n; i++ { c := b[i] if c >= 'A' && c <= 'Z' { c = ((c - 'A') + 13) % 26 + 'A' } elseif c >= 'a' && c <= 'z' { c = ((c - 'a') + 13) % 26 + 'a' } b[i] = c } return n, err }
funcmain() { s := strings.NewReader("Lbh penpxrq gur pbqr!") r := rot13Reader{s} io.Copy(os.Stdout, &r) }