This is an explanation of the video content.
 用技术延续对ACG的热爱
55

 |   | 

更好地理解 panic 如何中断程序的执行流程

panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码

package main

import "fmt"

func main() {
    fmt.Println("Start main")
    doSomething()
    fmt.Println("End main")
}

func doSomething() {
    fmt.Println("Start doSomething")
    panickingFunction()
    fmt.Println("End doSomething")
}

func panickingFunction() {
    fmt.Println("Start panickingFunction")
    panic("Oh no, something went wrong!")
    fmt.Println("End panickingFunction")
}

在这个程序中:

  • main() 函数首先打印 “Start main”。
  • 然后调用 doSomething() 函数。
  • doSomething() 函数首先打印 “Start doSomething”。
  • 接着调用 panickingFunction()。
  • panickingFunction() 函数首先打印 “Start panickingFunction”。
  • 然后执行 panic(“Oh no, something went wrong!”)。
  • 这里会中断 panickingFunction() 的执行,开始向上层的调用栈展开。

由于没有 recover() 来捕获 panic,程序最终会终止运行,并打印出 panic 信息。

所以在这个例子中,当 panickingFunction() 调用 panic() 时,程序的执行流程就被中断了,后续的 fmt.Println(“End panickingFunction”) 和 fmt.Println(“End doSomething”) 都无法执行。程序直接终止,并打印出 panic 信息。

55 服务端 ↦ Go开发技巧 __ 94 字
 Go开发技巧 #30