golang 函数-defer-recover-panic

函数

1、函数的定义

package main

import "fmt"

func add(a int, b int) int {  // 当函数参数类型相同时,除最后一个外其他类型可省略。
                            // add(a int,b int) == add(a,b int)
	return a+b
}

func main(){
	fmt.Println(add(1,2))
}
//执行结果:
# go run func.go
3

2、函数的多返回值

package main

import "fmt"

func add(a, b int) (int,int) {
	return a+b,a-b
}

func main(){
	fmt.Println(add(1,2))
}
//执行结果:3 -1

3、函数的匿名返回值

package main

import "fmt"

func add(a, b int) (x,y int) {
	x = a + b
	y = a - b
	return       //返回值定义返回x,y 因此return 后面可省略
}

func main(){
	fmt.Println(add(1,2))
}

4、函数不定长参数

package main

import "fmt"

func add(a, b int) (x,y int) {
	x = a + b
	y = a - b
	return
}

func sum(args ...int) int{
	final := 0
	for _,value := range args {   //当遍历时索引信息不需要可以用"_"来代替.
		final += value
	}
	return final

}

func main(){
	fmt.Println(add(1,2))
	fmt.Println(sum(1,2,3,4,5,6))
}
//执行结果:
3 -1
21

5、函数嵌套函数

package main

import "fmt"

func add(a, b int) int {
	num := 1
	sub := func() int{
		num -= 1
	 	return num
	}
	fmt.Println(sub())
	return a+b
}

func main(){
	fmt.Println(add(1,2))
}
//执行结果:
0
3

defer

1、defer可以在函数执行体都执行完后在执行

package main

import "fmt"

func clean(){
	fmt.Println(" do something in clean ")
}

func main(){
	defer clean()
	fmt.Println("end main")
}
//执行结果:
end main
do something in clean

recover

1、当程序出错时,可以通过recover来捕捉

package main

import "fmt"

func safeDivision(a,b int) int {
	defer func(){
		fmt.Println(recover())
	}()
	v := a / b
	return v
}

func main(){
	safeDivision(1,0)
	fmt.Println("end main")
}
//执行结果:
runtime error: integer divide by zero
end main

panic

1、可以通过panic来抛出异常,通过recover来捕捉

package main

import "fmt"

func demPanic() {
	defer func(){
		fmt.Println(recover())
	}()
	panic("PANIC")
}

func main(){
	demPanic()
	fmt.Println("end main")
}
//执行结果:
PANIC
end main
时间: 2025-01-04 11:46:43

golang 函数-defer-recover-panic的相关文章

【GoLang】panic defer recover 深入理解

先等我想清楚golang错误处理 为什么要这么设计的时候 再来更新... Golang这么时尚的语言是没有类似try..catch 这种异常处理机制,而是使用 panic 和 recover处理异常. 其实相当于python的raise. golang的异常处理组合 panic,defer,recover,跟java中的try catch finially是类似的. 但是从语言的用户体验来说,不怎么好. 但考虑到golang的场景基本是系统高性能层面的,这种精准错误处理应该减少那种后遗症bug.

理解Defer、Panic和Recover

刚开始的时候理解如何使用Defer和Recover有一点怪异,尤其是使用了try/catch块的时候.有一种模式可以在Go中实现和try/catch语句块一样的效果.不过之前你需要先领会Defer.Panic和Recover的精髓. 首先你需要理解defer关键字的作用,请看如下的代码: package main import ( "fmt" ) func main() { test() } func minicError(key string) error { return fmt.

Golang入门教程(十三)延迟函数defer详解

前言 大家都知道go语言的defer功能很强大,对于资源管理非常方便,但是如果没用好,也会有陷阱哦.Go 语言中延迟函数 defer 充当着 try...catch 的重任,使用起来也非常简便,然而在实际应用中,很多 gopher 并没有真正搞明白 defer.return.返回值.panic 之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!话不多说了,来一起看看详细的介绍吧. 基本介绍 延时调用函数的语法如下: defer func_name(param-list) 当一个函数调用

Go基础系列:defer、panic和recover

defer关键字 defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束.即便已经panic().即便函数已经return了,也都会执行defer所推迟的对象. 例如: func main() { a() } func a() { println("in a") defer b() println("leaving a") //到了这里才会执行b() } func b() { println("in b&qu

golang错误处理机制:panic与recover

原文地址:http://www.niu12.com/article/14 panic知识点 package main import ( "fmt" "github.com/pkg/errors" ) func main() { outerFunc() fmt.Println(1) } func outerFunc() { innerFunc() } func innerFunc() { panic(errors.New("An intended fatal

Go36-21,22-panic函数、recover函数以及defer语句

panic panic,Go语言的另外一种错误处理方式.严格来讲,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常. panic详情 要分析panic详情,首先来生成一个panic.比如在一个切片里,它的长度是5,但是要通过索引5访问其中的元素,这样的访问是不正确的.比如下面这样: func main() { l := []int{1, 2, 3, 4, 5} _ = l[5] } 程序在运行时,会在执行到这行代码的时候抛出panic,提示用户索引越界了.这不仅仅是个提示.当pan

go语言中使用defer、panic、recover处理异常

go语言中的异常处理,没有try...catch等,而是使用defer.panic.recover来处理异常. 1.首先,panic 是用来表示非常严重的不可恢复的错误的.在Go语言中这是一个内置函数,如果在程序中遇到异常,或者调用panic函数,程序会立即退出(除非recover).如下代码: package main import "fmt" func main() { a := 10 b := 0 c := a / b fmt.Println(c) } 程序的输出如下: ? de

defer、panic和recover

1. defer(1)defer用于将某个方法或语句推迟到当前函数返回的最后一刻执行,一般用于释放某些已分配的资源.函数返回的最后一刻指的是,return语句更新返回值变量之后,函数返回之前,所以defer语句甚至可用于修改函数的返回值(函数头部命名了返回值的情况).(2)若defer语句中嵌套了多层函数调用,只是最后一层函数调用才延后执行,其他都按代码执行顺序执行,例如:defer un(trace("b")),先按代码执行顺序执行trace("b"),假设返回值

GO开发[四]:golang函数

函数 1.声明语法:func 函数名 (参数列表) [(返回值列表)] {} 2.golang函数特点: a. 不支持重载,一个包不能有两个名字一样的函数 b. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量 c. 匿名函数 d. 多返回值 定义函数类型type: package main import "fmt" type add_func func(int, int) int func add(a, b int) int { return a + b } func sub

轻松掌握golang的defer机制

什么是defer? 如果熟悉python的话,会感觉defer在某种程度上有点类似于python中的上下文管理,golang中的defer是golang提供的一种延迟调用的机制,可以让一个函数在当前函数执行完毕(即使出错)后执行. 因此显然defer对于那些io流操作很有用,因为io流操作结束之后是需要close的,而程序员很容易忘记,所以defer是个好东西,经常用在资源清理.文件关闭.锁释放等等. defer的用法 直接把一个函数调用放在defer后面即可. f, err := os.Ope