Go语言的控制结构比Java、C语言都要少,只有很简单的几个,语法与也略有不同。
Go语言的保留关键字
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
运算符
* / %<< >> & &^+ - | ^ && || !
if
if中的条件不需要用中括号()给包含起来。
a := 1 b := 2 c := 3 if a < b && b < c { fmt.Println(true) } else { fmt.Println(false) }
而且if接受初始化语句,初始化的变量为一个局部变量。
if f,err := os.Open("c:/hello.go"); err == nil { fmt.Println(f.Name()) } else { fmt.Println(err) }
goto
在Java里这是一个保留关键字,但没有任何实际作用。goto用不好容易造成程序的逻辑混乱。下面用Lable标识一个标签,goto可以将执行跳转到这个标签位置,注意标签是大小写敏感的。
func myfunc() { i := 0 Lable: fmt.Println(i) i++ if i < 10 { goto Lable } }
for
Go中没有while,do while循环,只有一个for,不过却可以完成各种灵活循环操作,同样也不需要中括号包含。
依旧有break,continue关键字,用法和其它语言一样。
func main() { //跟Java相似的for循环 for i := 0; i < 10; i++ { fmt.Println(i) } //与While一样 for false { } /死循环 for { } Here: for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { fmt.Println(j) if j > 5 { break Here } } } }
range
range可以用于对集合的循环,集合后面在继续学习,先看一下用range来遍历数组。
var ss []string = []string{"aaa","bbb","ccc","ddd"} for i,v := range ss { fmt.Printf("索引是%d,值是:%s\n",i,v) }
switch
Go的switch很灵活,不一定非要用常量,还支持表达式,下面一组代码片断是判断常量的。
func main() { i := 0 switch i { case 0: //如果不加这个关键字,如果i等于0不会进到下面的case 1中 fallthrough case 1: fmt.Println(111) } }
func main() { ch := 'b' switch ch { //多个值用逗号分隔 case 'a','b','c': fmt.Println(111) default: fmt.Println(222) } }下面这段代码是 case表达式的
func main() { i := 10 switch { case i < 10: fmt.Println(111) case i < 20: fmt.Println(222) default: fmt.Println(333) } }非常灵活、强大的switch,但是也给我带来一个疑问,Go的编译器怎么对switch进行编译优化呢,假如说一个switch其中有几百甚至上千个case,起不是要按照顺序一个一个去匹配,时间复杂度就变成O(N)了,常量的switch好处就是可以让时间复杂度变成O(1)