type data struct {
x int
s string
}
var a data = data{1, "abc"}
b := data {
1,
"abc",
}
c := []int {
1,
2 }
d := []int{1, 2,
3, 4,
5,
}
3.4 流控制
if…else…
if x > 5 {
println("a")
} else if x < 5 && x > 0 {
println("B")
} else {
println("z")
}
if xinit(); x==0 { //优先执行xinit函数
println("a")
}
if a, b := x+1, x+10; a<b { //定义一个或多个局部变量
println(a)
} else {
println(b)
}
func main() {
a, b, c, x := 1, 2, 3, 2
switch x {
case a, b: //多个匹配条件命中其一即可(OR),变量
println("a | b")
case c:
println("c")
case 4:
println("d")
default:
println("z")
}
}
相邻的空case不构成多条件匹配
switch x {
case a: //单条件, 内容为空。隐式"case a: break;"
case b:
println("b")
}
func main() {
data := [3]int{10, 20, 30}
for i, x := range data { //从data复制品中取值
if i == 0 {
data[0] += 100
data[1] += 200
data[2] += 300
}
fmt.Printf("x:%d, data:%d\n", x, data[i])
}
for i, x := range data[:] { //仅复制slice,不包括底层array
if i == 0 {
data[0] += 100
data[1] += 200
data[2] += 300
}
fmt.Printf("x:%d, data:%d\n", x, data[i])
}
}
建议嵌套循环不要超过2层,否则会难以维护。必须时可剥离,重构为函数。
goto,continue,break
使用goto前,须先定义标签。标签区分大小写,且未使用的标签会引发编译错误
func main() {
start: //label start defined and not used
for i:=0; i<3; i++ {
println(i)
if i>1 {
goto exit
}
}
exit:
println("exit.")
}