本节续学上节Go,先来谈谈算数运算符以及一起特殊运算符操作,最后学习本节的重点:条件与循环。(学习来自极客时间Go课程)。
算数运算符
Go语言没有前置的++,--
用==比较数组
在其他语言当中,用==比较是比较两个数组的引用,而不是值,但是Go不一样。
位运算符
&^按位零 ,如下:
1 & ^0 --- 1
1 & ^1 --- 0
0 &^ 1 --- 0
0 &^ 0 --- 0
上述综合例子:
package operator_test
import (
"testing"
)
func TestCompareArray(t *testing.T) {
a := [...]int{1, 2, 3, 4}
b := [...]int{1, 3, 4, 5}
// c := [...]int{1, 2, 3, 4, 5}
d := [...]int{1, 2, 3, 4}
t.Log(a == b) //false 长度,维数都相同,但元素不同
//数组长度不同,编译错误!
// t.Log(a == c) //invalid operation: a == c (mismatched types [4]int and [5]int)
t.Log(a == d) //true 长度,维数相同,元素都相同
}
const (
Readable = 1 << iota //1
Writable //10
Executable //100
)
func TestBitClear(t *testing.T) {
a := 7 //0111
a = a &^ Readable
a = a &^ Executable
t.Log(a&Readable == Readable, a&Writable == Writable, a&Executable == Executable) //false true false
}
Go语言仅支持循环关键字for
c/c++中
for(j:=7;j<=9;j++)
Go中 不需要前后括号!
while
条件循环
while(n<5)
可表示为:
n:=0
for n<5 {
n++
fmt.Println(n)
}
无限循环
while(true)
可表示为:
n:=0
for {
...
}
if条件
不需要()
if condition {
...
} else if {
...
} else {
...
}
与其他主要编程语言的差异:
if var declaration; condition {
...
}
if v,err := someFunc(); err==nil {
...
} else {
...
}
switch 条件
不限制常量或整数表达式
switch os := runtime.GOOS; os{
case "darwin":
...
case "linux":
...
default:
...
Go语言中默认是添加了break,可以不用添加!
上述综合例子:
package condition_test
import (
"testing"
)
func TestIfMultiSec(t *testing.T) {
if a := 1 == 1; a {
t.Log("1==1")
}
for i := 0; i < 5; i++ {
switch i {
case 0, 2:
t.Log("Even")
case 1, 3:
t.Log("Odd")
default:
t.Log("it is not 0-3")
}
}
for i := 0; i < 5; i++ {
switch { //这里没有switch表达式!在此种情况下,整个switch结构与多个if...else...的逻辑作用等同
case i%2 == 0:
t.Log("Even")
case i%2 == 1:
t.Log("Odd")
default:
t.Log("unknow")
}
}
}
func TestWhileLoop(t *testing.T) {
n := 0
for n < 5 {
t.Log(n)
n++
}
}
总结:
(1)条件表达式不限制为常量或整数表达式
(2)单个case中,可以出现多个结果选项,使用逗分隔;
(3)与C语言等规则相反,Go语言不需要用break来明确退出一个case;
(4)可以不设定switch之后的条件表达式,在此种情况下,整个switch结构与多个if…else…的逻辑作用等同。