zoukankan      html  css  js  c++  java
  • Go 高级(if for switch 等)

    for

    Go 只有一种循环结构——`for` 循环。

    基本的 for 循环除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中做的一样,而 `{ }` 是必须的。

    package main
    
    import "fmt"
    
    func main() {
    	sum := 0
    	for i := 0; i < 10; i++ {
    		sum += i
    	}
    	fmt.Println(sum)
    }
    

    for(续)

    跟 C 或者 Java 中一样,可以让前置、后置语句为空。

    package main
    
    import "fmt"
    
    func main() {
    	sum := 1
    	for ; sum < 1000; {
    		sum += sum
    	}
    	fmt.Println(sum)
    }
    


    for 是 Go 的 “while”

    基于此可以省略分号:C 的 while 在 Go 中叫做 `for`。

    package main
    
    import "fmt"
    
    func main() {
    	sum := 1
    	for sum < 1000 {
    		sum += sum
    	}
    	fmt.Println(sum)
    }
    

    死循环

    如果省略了循环条件,循环就不会结束,因此可以用更简洁地形式表达死循环。

    package main
    
    func main() {
    	for {
    	}
    }
    

    if

    if 语句除了没有了 `( )` 之外(甚至强制不能使用它们),看起来跟 C 或者 Java 中的一样,而 `{ }` 是必须的。

    (耳熟吗?)

    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 的便捷语句

     for 一样,`if` 语句可以在条件之前执行一个简单的语句。

    由这个语句定义的变量的作用域仅在 if 范围之内。

    (在最后的 return 语句处使用 v 看看。)

    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

     if 的便捷语句定义的变量同样可以在任何对应的 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
    ", v, lim)
    	}
    	// 这里开始就不能使用 v 了
    	return lim
    }
    
    func main() {
    	fmt.Println(
    		pow(3, 2, 10),
    		pow(3, 3, 20),
    	)
    }
    

    switch

    一个结构体(`struct`)就是一个字段的集合。

    除非以 fallthrough 语句结束,否则分支会自动终止。

    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 的执行顺序

    switch 的条件从上到下的执行,当匹配成功的时候停止。

    (例如,

    switch i {
    case 0:
    case f():
    }

     i==0 时不会调用 `f`。)

    注意:Go playground 中的时间总是从 2009-11-10 23:00:00 UTC 开始, 如何校验这个值作为一个练习留给读者完成。

    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

    没有条件的 switch 同 `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.")
    	}
    }
    

     

  • 相关阅读:
    常见DOS命令总结
    常见DOS命令总结
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    【数论】——逆元
    【数论】——逆元
    需要了解的几个Java基础点
    TreeMap读源码总结
    Reactor模式
    Maven常见问题总结
  • 原文地址:https://www.cnblogs.com/liyuzhao/p/3887521.html
Copyright © 2011-2022 走看看