在Go程序设计中看到如下代码
//Some code to create network link to server ...
func main() {
con, err := net.Dial("tcp","host to server")
if err != nil {
log.Fatal(err)
}
defer con.Close()
mustCopy(os.Stdout,con)
}
func mustCopy(dst io.Writer,src io.Reader) {
if _,err := io.Copy(dst,src); err != nil {
log.Fatal(err)
}
}
现在我的疑问是 如果 在mustCopy中产生err执行log.Fatal(err)后, main的中defer 语句还会执行吗(log.Fatal(err)调用了os.Exit(0))? 如果执行了;有什么方法可以捕捉到那条语句的确执行了? 感谢在先.
做了如下测试,终端却没有打印..... 也打了断点发现程序直接退出.
func main() {
defer fmt.Println("Main Code")
subRoting()
}
func subRoting() {
log.Fatal("")
}
先回答问题:不执行了,你下面的测试程序也说明了这一点。
defer 的作用是在函数退出之前执行所 defer 的函数,当执行 log.Fatal 的时候直接程序就退出了,你那个 main 函数就没有执行到最后,肯定就不会执行所 defer 的函数啦