上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
3.1 选择
两种分支选择控制语句。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论