go里面if不需要括号将条件表达式包含起来,这与python也有点类似
if 条件表达式 {
}
if num > 18 {
// ...
} else if num > 20 {
// ...
} else {
// ...
}
需要注意的是go支持在if的条件表达式中直接定义一个变量,变量的作用域只在if范围内,如:
if num := 20; num > 5 {
// ...
}
这让我们一些场景可以便捷地存储中间变量
go语言的switch分支不需要有break语句,这是与c不同的地方。基本语法如下:
switch expression {
case expression1,expression2,…:
// …
case expression3, expression4,…:
// …
// …
default:
// …
}
golang中是允许多个表达式匹配的,比如expression1或expression2,就会执行第一个case。default语句不是必须的,但为了程序稳定通常需要有默认操作。
switch num {
case 1, 2, 3:
fmt.Println("num", num)
case 4, 5, 6:
num++
default:
fmt.Println("not in range")
}
另外,switch后面也可以不带表达式,这时等价于if -else
switch {
case num == 1:
// ...
case num == 2:
// ...
default:
// ...
}
switch后面也可以定义一个变量,分号结束,通常不这样写:
switch num := 90; {
case num > 90:
// ...
default:
// ...
}
在一个case语句中使用fallthrough,则会继续执行下一个case分支,注意这里下一个分支不用判断,直接执行。但通常不用,条件语句已经足够覆盖所有场景
switch num {
case 10:
// ...
fallthrough
case 20:
// ...
default:
// ...
}
switch语句还可以用来判断某个interface变量中实际指向的变量类型
var x interface
var y = 10.0
x = y
switch i : x.(type) {
case nil:
// ...
case int:
// ...
case float64:
// ...
case func(int) float64:
fmt.Printf("x 是 func(int)型")
case bool, string:
//
default:
// ...
}
go语言的for循环也是不需要用()把表达式给包起来,如:
for num := 0; num <= 10; num++ {
// ...
}
此外,for循环可以有以下两种写法
for num < 99 {
// 只写循环条件的写法
}
for {
// 什么条件都不写,相当于无限循环,在内部决定循环终止条件
}
// 上面的for等价于
for ; ; {
}
另外,go语言也支持fo range的遍历方式,便于遍历字符串和数组,如:
str1 := "hello, zhangping"
for index, val := range str1 {
fmt.Printf("index:%d val=%c\n", index, val)
}
for range遍历字符串时,是按照字符来遍历的,而不是按照字节来遍历的。与我们常规字节遍历的区别在于,像遍历中文字符串,for range会打印一整个中文字符,但常规字节遍历会打印单个字节(一个中文两个字节),通常会乱码
传统的方法想要打印中文,需要转换成rune的切片:
str1 := "hello, 张平"
str2 := []rune(str1)
for i := 0; i < len(str2); i++ {
fmt.Printf("%c\n", str2[i])
// break
// coontinue
}
go里面没有while和do while语句,要跳出循环也是break,跳过本次循环continue,另外go语言也支持goto语句跳到任意语句处,但最好不要用。