Golang:for、switch

for

  • range表达式结果可以是数组,数组指针,切片,字符串,字典或者通道。
  • 使用range时迭代切片,若只有一个迭代变量,那么这个迭代变量是索引;如果有两个迭代变量,则第一个迭代变量是索引,第二个迭代变量是元素值。
  • range表达式只会在for语句开始时被求值一次,求值结果会被复制,即被迭代对象是range表达式结果值得副本而不是原值

switch

  • switch表达式和case表达式结果类型一定要相同。
  • 如果switch表达式的结果值是无类型常量,比如1+3的求值结果就是无类型常量4,那么这个常量会被自动转换为此种常量的默认类型的值,比如4的默认类型是int,3.14默认类型float64,此时case表达式结果也需要是同类型,否则无法通过编译
  • 如果switch表达式的结果值类型是int8,那么case表达式结果值是无类型常量,那么它的类型会自动转换为switch表达式的结果类型(可以转换的前提下)。转换不成功依然无法通过编译。
  • 如果表达式中有接口类型,一定要注意它们的动态值是否允许判等操作。
  • fallthrough用在某个case代码块末尾(该case不能是最后一个),表示执行下一个case(如果下一个case是default也会执行)。
  • default写在中间位置和末尾位置效果相同,都会当没有case满足时才执行。
// 最终会打印3、4
switch 3 {
	case 1:
		fmt.Println(1)
		fallthrough
	case 2:
		fmt.Println(2)
	case 3:
		fmt.Println(3)
		fallthrough
	default:
		fmt.Println(4)
  • case表达式结果不能相同,否则不能通过编译,比如
value3 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value3[4] {
case 0, 1, 2:
  fmt.Println("0 or 1 or 2")
case 2, 3, 4:
  fmt.Println("2 or 3 or 4")
case 4, 5, 6:
  fmt.Println("4 or 5 or 6")
}
  • 但是可以用索引方式绕过限制,比如下面这种就可以通过编译:

value5 := [...]int8{0, 1, 2, 3, 4, 5, 6}
switch value5[4] {
case value5[0], value5[1], value5[2]:
  fmt.Println("0 or 1 or 2")
case value5[2], value5[3], value5[4]:
  fmt.Println("2 or 3 or 4")
case value5[4], value5[5], value5[6]:
  fmt.Println("4 or 5 or 6")
}
  • 对于类型判断的switch,无法使用索引绕过,编译器会识别出byte是uint8重复,比如:

value6 := interface{}(byte(127))
switch t := value6.(type) {
case uint8, uint16:
  fmt.Println("uint8 or uint16")
case byte:
  fmt.Printf("byte")
default:
  fmt.Printf("unsupported type: %T", t)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值