ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

golang使用defer panic recover 函数进行控制

2021-10-20 14:05:49  阅读:200  来源: 互联网

标签:defer 函数 fmt highlow golang high low recover


让我们看看go特有的一些控制流,defer,panic,recover。

defer函数

go中,defer语句会推迟函数的运行,知道包含defer语句的函数完成,通常情况下,当你想要避免忘记任务是,可以推迟某个函数的运行。可以根据需要推迟任意多个函数,defer语句按逆序运行,先运行最后一个。

package main

import "fmt"

func main() {
	for i := 1; i <= 4; i++ {
		defer fmt.Println("延迟输出", -i)
		fmt.Println("正常输出", i)
	}
}

 在此示例中,请注意每次推迟fmt.println都会存储一个I的值,并会将其运行任务添加到队列中,在main()函数输出完regular值后,所有推迟的调用都会运行。就是后进先出的原因

defer函数的一个典型用例实在使用完文件后将其关闭

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	newfile, error := os.Create("learnGo.txt") //创建一个learnGo.txt
	if error != nil {   //if不为空
		fmt.Println("Error :could not  creat file.")//不为空就打印这一句话
		return
	}
	defer newfile.Close()  //延迟关闭
	if _, error = io.WriteString(newfile, "Learning go!"); error != nil {
		fmt.Println("Error :could not  write  to file")
		return
	}
	newfile.Sync()

}

 创建或打开某个文件后,可以推迟.close()函数的执行。

panic函数

运行时错误会使go程序崩溃,例如尝试通使用超过范围的索引或取消引用nil指针来访问数组,你也可以强制程序崩溃

内置panic()函数可以停止go程序中的正常控制流,当你使用panic调用时,任何延迟的函数调用都将正常运行。进程会在堆栈中继续,直到所有函数都返回,然后程序会崩溃并记录日志消息,此消息包含消息和堆栈跟踪

调用panic()函数时,可以添加任何值作为参数,通常你会发送一条错误消息,说明为什么会进入紧急状态

package main

import "fmt"

func highlow(high int, low int) {
	if high < low {
		fmt.Println("panic")
		panic("highlow() low greater than  high")
	}
	defer fmt.Println("Deferred:highlow(", high, ",", low, ")") //   " , high , " 接收参数
	fmt.Println("call:highlow(", high, ",", low, ")")
	highlow(high, low+1)
}
func main() {
	highlow(2, 0)
	fmt.Println("program finished  successfully!")
}

运行代码时会发生的情况

 一切正常运行,程序将输出传递到highlow()函数中的高值和低值

如果low的值大于high的值,则程序会崩溃,会显示panix消息,此时控制流中断,所有推迟的函数都开始输出defer

程序崩溃并显示完整的堆栈跟踪

在发生未预料到的严重错误时,系统通常会运行对panic()函数的调用,若要避免程序崩溃,go提供内置recover()函数,让你可以在程序崩溃之后重新获得控制权,你只会在你同事调用defer的函数中调用recover。如果调用recover函数,则在正常运行的情况下,会反馈nil

package main

import "fmt"

func highlow(high int, low int) {
	if high < low {
		fmt.Println("Panic!")
		panic("highlow() low  greater than high")
	}
	defer fmt.Println("Deferred: highlow(", high, ",", low, ")")
	fmt.Println("call :highlow(", high, ",", low, ")")
	highlow(high, low+1)
}
func main() {
	defer func() {
		handler := recover()
		if handler != nil {
			fmt.Println("main(): recover", handler)
		}
	}()
	highlow(2, 0)
	fmt.Println("program finished  successful!")
}

 在main()函数汇总,调用recover()函数的匿名函数。当程序处理紧急状态时,对recover()的调用无法返回nil。

标签:defer,函数,fmt,highlow,golang,high,low,recover
来源: https://blog.csdn.net/ens160/article/details/120830249

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有