返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

3.1 选择

发布于 2024-10-12 19:15:47 字数 2843 浏览 0 评论 0 收藏 0

两种分支选择控制语句。

  • if :适合逻辑控制,分支数量不宜过多。
  • switch :适合数据匹配,分支内容不宜过长。

至于两者性能差异,与具体场景及编译器优化策略有关。

条件控制

条件表达式值必须是布尔类型,可省略括号,且左大括号不能另起一行。

func main() {
	
	// if 1 {}
	//    ~ non-boolean condition in if statement

	if true 
	{  // syntax error: unexpected newline, expecting { after if clause

	}
}
  • 善用初始化语句,组合调用和返回值处理。
  • 如定义局部变量,其作用域覆盖所有分支。
  • 减少嵌套和分支,让正常逻辑处于相同层次。
  • 如条件表达式过于冗长,可将其重构为函数。
func do(x int) error {
	if x <= 0 {
		return errors.New("x <= 0")
	}
	return nil
}

func main() {
	x := 10
    
    // 局部变量 err 作用域覆盖所有分支。
	if err := do(x); err == nil {
        // 正常逻辑。
		x++
		println(x)
	} else {
        // 错误处理。
		log.Fatalln(err)
	}
}

上例中,错误处理和正常逻辑混杂。改写一下!

func main() {
	x := 10
	err := do(x)

    // 错误处理是对正常逻辑的补充。
    // 是阅读时可被 “忽略” 的片段。
	if err != nil {
		log.Fatalln(err)
	}
	
	x++
	println(x)
}

多路执行

利用 switch 语句进行多路匹配。

  • 支持初始化语句。
  • 从上到下、从左到右顺序匹配。
  • 全部匹配失败,执行 default
  • 隐式 break 中断。
  • 相邻空 case 不构成多条件匹配。
func main() {
	a, b, c := 1, 2, 3
    
	switch x := 5; x {
	case a, b:              // OR
		println("a | b")
	case c:
		println("c")
	case 4:
		println("d")
	default:
		println(x)
	}
}

// 5
func main() {
	switch x := 1; x {
	case 0:              // 隐式 break 中断。
	case 1:
	case 2:
		println("b")
	}
}

匹配条件中,不能有重复常量值,变量则按次序匹配。

func main() {
	switch x := 1; x {
	case 1:
	case 1, 2:  // duplicate case 1 (constant of type int)
	}
}
func main() {
	a, b := 1, 2
	x := a

	switch x {
	case b, a: println("b, a")
	case a   : println("a")
	}
}

// b, a

执行 fallthrough 贯通后续分支。

  • 按源码顺序。
  • 不检查后续条件。
  • 必须是当前块(case)结尾,且后面有其他块。
func main() {
	switch x := 5; x {
	case 5:
		println("5")
		fallthrough    // 不检查 case 6 条件。
	case 6:
		println("6")
	case 7:
		println("7")
	}
}

// 5
// 6
func main() {
	switch x := 5; x {
	default:
		println("0")
	case 5:
		println("5")

		// 按源码顺序,所以上面的 default 不执行。
		// 除非将 default 挪到下面。

		// fallthrough
		// ~~~~~~~~~~~ cannot fallthrough final case in switch
	}
}
func main() {
	switch x := 5; x {
	case 5:
		x += 10

		// if x >= 15 {
		// 	fallthrough   // fallthrough statement out of place
		// }

		if x < 15 { break }
		fallthrough
	case 6:
	}
}

某些时候,省略条件变量以替换分支过多的 if 语句。

func main() {
	switch x := 1; {        // switch x := 5; true { ... }
	case x == -1, x == 1:   // OR, ||
		println("a")
	case x > 1 && x <= 10:
		println("a")
	case x > 10:
		println("b")
	default:
		println("z")
	}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文