case穿透:case执行完毕后自动中断,如需贯通后续case,须执行fallthrough,但不再匹配后续条件表达式
func main() {
switch x := 5; x {
default:
println(x)
cade 5:
x += 10
println(x)
fallthrough
case 6:
x += 20
println(x)
//fallthrough //如果在此处继续fallthrough,不会执行default,完全按照源码顺序来,会报错
}
}
注意,fallthrough必须放在case块结尾,可使用break语句阻止
switch语句也可用于接口类型匹配,详见后续文章
注意:range会复制目标数据,受直接影响的是数组,可改用数组指针或切片类型
func main() {
data := [3]int{10, 20, 30}
for i, x := range 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[:] {
if i == 0 {
data[0] += 100
data[1] += 200
data[2] += 300
}
fmt.Printf("x: %d, data: %d\n", x, data[i])
}
}
输出:
x: 10, data: 110
x: 20, data: 220 //range返回的依旧是复制值
x: 30, data: 330
x: 110, data: 210
x: 420, data: 420 //当i == 0 修改data时,x已经取值,所以依旧是110
x: 630, data: 630 //复制的仅是slice自身,底层array依旧是原对象
所以在处理数据巨大的多次遍历操作时,尽量不要使用range,容易造成堆栈溢出
for 和 for range有什么区别?
(主要是使用场景不同)
for可以:
遍历array和slice
遍历key为整型递增的map
遍历string
for range可以完成所有for可以做的事情,却能做到for不能做的,包括:
遍历key为string类型的map并同时获取key和value
遍历channel
注意:goto不能跳转到其他函数,或内层代码块内