go recover函数

合集下载

Go语言规格说明书之内建函数(Built-infunctions)

Go语言规格说明书之内建函数(Built-infunctions)

Go语⾔规格说明书之内建函数(Built-infunctions)go version go1.11 windows/amd64本⽂为阅读Go语⾔中⽂官⽹的规则说明书(https:///ref/spec)⽽做的笔记,介绍Go语⾔的内建函数(Built-in functions)。

规格说明书中的⽬录如下:Built-in functions-Close-Length and capacity-Allocation-Making slices, maps and channels-Appending to and copying slices-Deletion of map elements-Manipulating complex numbers-Handling panics-Bootstrapping在规格说明书中,介绍了15个内建函数,如下所⽰:close, len, cap, new, make, append, copy, delete,complex, real, imag, panic, recover,print, println下⾯简要介绍各个函数:close关闭信道(channel)。

在没有更多数据要发送的时候关闭信道。

close(channel)也就是说,channel必须是只发或双向类型的才可以,否则错误。

发送或关闭⼀个已经关闭的信道会出现运⾏时错误(run-time panic)。

关闭 nil 信道也会导致运⾏时错误。

在调⽤close函数,并且之前发送的数据都已被接收到之后,接收操作会返回信道类型的0值,且不会阻塞,,多个值的接收操作会返回⼀个接收值和信道是否关闭的标志。

// 单个值接收操作v1 := <-chv2 = <-ch// 多(两)个值接收操作x, ok = <-chx, ok := <-chvar x, ok = <-chvar x, ok T = <-chlen,cap这两个函数接收各种类型的参数,返回⼀个int型的结果。

recover的用法总结大全

recover的用法总结大全

recover的用法总结大全复苏的意思vt. 恢复,重新获得,找回,vi. 恢复健康(体力、能力等)n. 恢复开始时姿势变形:形容词:recovered; 过去式: recovered; 现在分词:recovering; 过去分词:recovered;recover用法recover可以用作动词recover的基本意思是“寻回”“取回”,指无意或有意地找到或得到曾经失掉的物质的或精神的东西,引申可指“恢复”“重新控制”“重新获得”“回复到正常状态”等。

恢复用作及物动词时,如与人,与活动结构;至于主题,被动的对象结构。

一个对象可以由名词、代词。

recover用作不及物动词时,常跟from连用,表示从某种情况或状态中恢复过来。

recover用作动词的用法例句He's now fully recovered from his stroke.他现已从中风病完全康复了。

He is very ill and unlikely to recover.他病得非常厉害,不大可能恢复健康了。

I nearly fell but managed to recover myself.我差一点倒下,但最后还是站稳了脚根。

恢复使用示例1、Legal action is being taken to try to recover the money.正在进行的诉讼收回这笔钱。

2、Firms need a breathing space if they are to recover.这些公司需要短暂休整才能恢复元气。

3、We are taking advice on legal steps to recover the money.我们是法律程序恢复所需的资金咨询律师。

recover的短语:recover from(v.+prep.)1.从…收回〔取回〕 get back sth from sb/sthdon't lend books to your friends; it's difficult to recover the books fromthem when you want them.不要把书借给你的朋友们,在你需要时,很难从他们那儿把书要回来。

go的语法

go的语法

go的语法Go语言中的函数Go语言是一种静态类型的编程语言,它支持面向对象编程和函数式编程。

在Go语言中,函数是一等公民,这意味着函数可以像其他类型的值一样被传递、赋值和返回。

本文将介绍Go语言中的函数。

函数的定义在Go语言中,函数的定义使用关键字func,语法如下:```func 函数名(参数列表) (返回值列表) {函数体}```其中,参数列表和返回值列表都是可选的。

如果函数没有参数,则参数列表可以省略;如果函数没有返回值,则返回值列表可以省略。

函数的调用在Go语言中,函数的调用使用函数名和参数列表,语法如下:```函数名(参数列表)```例如,下面是一个简单的函数调用:```func main() {fmt.Println("Hello, world!")}```在这个例子中,我们调用了名为fmt.Println的函数,并传递了一个字符串参数"Hello, world!"。

函数的参数在Go语言中,函数的参数可以是值类型、指针类型或引用类型。

值类型的参数是函数的副本,对参数的修改不会影响原始值。

指针类型的参数是指向原始值的指针,对参数的修改会影响原始值。

引用类型的参数是指向原始值的引用,对参数的修改也会影响原始值。

例如,下面是一个函数,它接受一个指针类型的参数,并修改了原始值:```func increment(x *int) {*x++}func main() {x := 0increment(&x)fmt.Println(x) // 输出1}```在这个例子中,我们定义了一个名为increment的函数,它接受一个指向int类型的指针作为参数。

在函数体中,我们使用解引用运算符*来访问指针指向的原始值,并将其加1。

在main函数中,我们定义了一个名为x的变量,并将其初始化为0。

然后,我们调用increment函数,并传递x的地址作为参数。

最后,我们打印x的值,输出1。

GO语言异常处理机制

GO语言异常处理机制

GO语⾔异常处理机制对⽐其他语⾔其他语⾔⽐如Python⽤的是try Except finally的⽅式来进⾏异常处理,执⾏逻辑是:尝试执⾏⼀段代码,如果发⽣异常则执⾏...⽆论是否发⽣异常都执⾏...;相⽐起来go语⾔的异常处理就简单许多,因为程序中的异常基本上都是可预期的,所以GO语⾔处理异常的⽅式是返回这个异常,如果没有发⽣异常则该值为nil,只要判断这个预期的返回值是否是nil便知道有没有异常发⽣.go语⾔中还有⼀种panic机制,panic可以理解为致命的异常会中断程序的运⾏,但是通过recover函数可捕获这个panic让程序继续运⾏.errorGO语⾔中⼀个普通的错误被称为error,它本质是⼀个接⼝类型,可以在builtin.go中看到其定义// The error built-in interface type is the conventional interface for// representing an error condition, with the nil value representing no error.type error interface {Error() string}error可以出现在很多地⽅,⽐如打开⼀个不存在的⽂件,还有数学运算错误等等.例⼦:package mainimport ("fmt""os")type people interface {name() string}func main() {_, err := os.Open("不存在.go")if err != nil {fmt.Println(err) // open 不存在.go: no such file or directory}}创建error前⾯我们获得error的⽅法是接受别⼈写好函数的返回值,现在我们尝试⾃⼰创建⼀个error,在errors包中有多个创建error的⽅法,其中最常⽤的是errors.New()⽅法,该⽅法接收⼀个字符串⽤于描述这个错误.其实现如下:// New returns an error that formats as the given text.// Each call to New returns a distinct error value even if the text is identical.func New(text string) error {return &errorString{text}}// errorString is a trivial implementation of error.type errorString struct {s string}func (e *errorString) Error() string {return e.s}New⽅法返回了⼀个errorString结构体并将参数text穿进这个结构体中,这个结构体因为实现了Error⽅法所以他是⼀个error类型.利⽤errors.New⽅法创建新error的例⼦:package mainimport ("errors""fmt")func main() {err := errors.New("我⾃⼰创建的⼀个错误")fmt.Println(err) // 我⾃⼰创建的⼀个错误}除了errors.New()⽅法创建error外,还可以⽤fmt.Errorf函数创建新的error,让我们看看fmt.Errorf函数内部的实现:func Errorf(format string, a ...interface{}) error {p := newPrinter()p.wrapErrs = truep.doPrintf(format, a)s := string(p.buf)var err errorif p.wrappedErr == nil {err = errors.New(s)} else {err = &wrapError{s, p.wrappedErr}}p.free()return err}在var err error之前的语句看不懂没关系, 我简单的说⼀下:创建了⼀个pp结构体指针,然后设置了wrapErrs为true,并调⽤doPrintf⽅法将我们的格式化输⼊转化成对应字符串,此时还存在p的缓冲区中,然后通过string进⾏类型转化将得到的字符串村进变量s.关键看那个判断语句,这说明,Errorf函数⽣成错误有两种⽅式,要么调⽤errors.New要么返回⼀个wrapError类型实例.errors.New已经介绍过,下⾯看看wrapError结构体:type wrapError struct {msg stringerr error}func (e *wrapError) Error() string {return e.msg}相信⼤家都能明⽩了吧举个fmt.Errorf的例⼦package mainimport ("fmt")func main() {err := fmt.Errorf("error error error")fmt.Println(err) // error error error}番外篇 String() 和 Error()在golang中如果直接打印⼀个普通对象,得到的结果就会向下⾯⼀样,package mainimport "fmt"type People struct {name stringage int}func main(){p := &People{name: "horika",age: 10,}fmt.Println(p) // &{horika 10}fmt.Printf("%s\n", p) // &{horika %!s(int=10)}}也许有时候我们需要在打印或者转换成字符串时想要让他输出⾃定义的⼀句话,这时我们可以给这个结构体增加⼀个String⽅法,如下:package mainimport "fmt"type People struct {name stringage int}func (p *People) String() string{return fmt.Sprintf("我叫%s, 我今年%d岁", , p.age)}func main(){p := &People{name: "horika",age: 10,}fmt.Println(p) // 我叫horika, 我今年10岁fmt.Printf("%s\n", p) // 我叫horika, 我今年10岁}注意如果我们定义的String⽅法是指针调⽤的那么我们必须打印指针对象才有效果,也就是你定义什么类型,就打印什么类型,同学们可以⾃⼰去尝试.如果我们的结构体定义了⼀个Error⽅法,那么打印的时候会优先调⽤Error⽅法,如下只定义Error⽅法的例⼦:package mainimport "fmt"type People struct {name stringage int}func (p *People) Error() string{return fmt.Sprintf("[Error] 我叫%s, 我今年%d岁", , p.age)}func main(){p := &People{name: "horika",age: 10,}fmt.Println(p) // [Error] 我叫horika, 我今年10岁fmt.Printf("%s\n", p) // [Error] 我叫horika, 我今年10岁}即有String⽅法也有Error⽅法package mainimport "fmt"type People struct {name stringage int}func (p *People) String() string{return fmt.Sprintf("[String] 我叫%s, 我今年%d岁", , p.age)}func (p *People) Error() string{return fmt.Sprintf("[Error] 我叫%s, 我今年%d岁", , p.age)}func main(){p := &People{name: "horika",age: 10,}fmt.Println(p) // [Error] 我叫horika, 我今年10岁fmt.Printf("%s\n", p) // [Error] 我叫horika, 我今年10岁}可以看到如果Error和String⽅法同时存在,Error⽅法会覆盖String⽅法,看到这⾥我想你们就应该明⽩为什么我们之前打印⼀个error时只需要打印它本⾝⽽不⽤打印err.Error()了吧定义⾃⼰的错误看了前⾯的介绍我相信⼤家都能⾃⼰写⼀个错误类型,⽆⾮分两步,1. 定义⼀个结构体,2. 该结构体实现 Error() string⽅法.然⽽事实真的就是这么简单.其实在前⾯的番外篇⾥已经有了⾃定义错误的影⼦举个例⼦package mainimport "fmt"type MyIntNegativeError struct {msg stringval int}func (m *MyIntNegativeError)Error() string{return fmt.Sprintf("[ERROR] reason %s; val: %d", m.msg, m.val)}func NewMyIntNegativeError(msg string, val int) *MyIntNegativeError{return &MyIntNegativeError{msg: msg,val: val,}}func Sub10(a int) (int, error){ret := a - 10if ret < 0 {return 0, NewMyIntNegativeError("a必须⼤于10", a)}return ret, nil}func main(){a := 9ret, err := Sub10(a)if err != nil {fmt.Println("出错啦", err) // 出错啦 [ERROR] reason a必须⼤于10; val: 9return}fmt.Println(ret)}除了必须实现Error⽅法外,我⼀般习惯给⾃定义的错误实现⼀个构造函数.panic和recoverpanicpanic是⼀个内建函数,他会产⽣⼀个严重的错误使程序中断执⾏,举个例⼦package mainimport "fmt"func main(){for i:=1;i<10;i++{fmt.Println(i)if i%3 == 0{panic("出现数字3的倍数,我不想继续了")}}}输出123panic: 出现数字3的倍数,我不想继续了goroutine 1 [running]:main.main()/home/kain/Documents/code/go_module/file_io/main.go:9 +0xf5recoverrecover可以捕获⼀个panic使程序恢复运⾏,当然你也可以再次抛出异常,通常我们都是在defer语句中执⾏recover,这很容易理解,因为我们必须等所有程序都执⾏完才能保证整个过程不会发⽣panic,举个例⼦package mainimport "fmt"func main(){f1()}func f1(){defer func() {pan := recover()if pan != nil{fmt.Println("我已经捕获了错误,错误是:", pan)fmt.Printf("错误类型是%T\n", pan)}else{fmt.Println("没有错误")}}()for i:=1;i<10;i++{fmt.Println(i)if i%3 == 0{panic("出现数字3的倍数,我不想继续了")}}}输出123我已经捕获了错误,错误是: 出现数字3的倍数,我不想继续了错误类型是string以上就是golang的异常处理机制。

go发生空指针引用 recover处理方式 -回复

go发生空指针引用 recover处理方式 -回复

go发生空指针引用recover处理方式-回复本文将围绕着go语言中的空指针引用和如何使用recover函数来处理发生了空指针引用的情况展开讨论。

我们将逐步介绍go语言中的指针、空指针引用的原理,以及如何使用recover函数来处理这种错误。

一、指针和空指针引用的理解在go语言中,指针是一个变量,它存储了一个值的地址。

通过操作指针,我们可以直接访问内存中的数据,这使得我们可以更高效地操作数据,特别是在涉及传递大量数据的情况下。

一种特殊的指针是空指针(nil pointer),它指向内存地址0。

当一个指针没有明确指向任何对象或变量时,它的值被设置为nil。

空指针引用发生在试图对一个空指针进行操作(如解引用)时,它会导致程序崩溃或产生意外的行为。

二、发生空指针引用的原因空指针引用通常是由于以下原因之一导致的:1. 未初始化的指针:当我们声明一个指针变量但未初始化它时,它的值将是nil。

如果我们尝试对一个未初始化的指针进行操作,就会发生空指针引用。

2. 指针赋值为nil:有时我们可能会在某些条件下将一个指针赋值为nil。

然而,如果我们在之后尝试对这个nil指针进行操作,就会发生空指针引用。

3. 函数返回nil指针:当函数返回一个指针类型的值时,我们需要确保检查返回值是否为nil。

如果我们没有进行检查,并尝试对返回的nil指针进行操作,就会发生空指针引用。

三、recover函数的介绍recover是go语言的一个内置函数,它用于恢复发生panic(错误)时的程序控制权。

当程序中发生panic时,它会中断程序的执行并引发一个运行时错误。

我们可以使用recover函数来捕获这个错误并进行处理,以避免程序崩溃。

recover函数必须在defer中调用,否则它不能正常工作。

当它被调用时,它将返回panic的值,如果没有发生panic,它将返回nil。

四、使用recover处理空指针引用我们可以通过结合使用defer和recover来处理发生空指针引用的情况。

go语言常用函数

go语言常用函数

go语言常用函数Go语言是由Google于2007年推出的一种编程语言,其优雅的语言设计,快速高效的编译速度,让Go语言逐渐成为一种非常流行的编程语言。

开发人员可依靠Go语言构建高可靠性、高性能和高并发的应用程序。

与其他编程语言相比,Go语言具有许多独特和重要的特性。

在编写Go应用程序时,有许多有用的函数可供开发人员使用,这些函数提供了强大而丰富的库和工具来帮助开发人员解决常见的编程问题。

让我们来看一下Go语言中一些最常用的函数。

1.字符串函数Go语言内置了一些用于处理字符串的函数,这允许开发人员很容易地处理和操作字符串。

其中一些常用的字符串函数包括len(str):返回字符串的长度,strings.Contains(str, substr):检查一个字符串是否包含另一个字符串,strings.Index(str, substr):在一个字符串中查找另一个字符串的位置等等。

2.文件I/O函数Go语言内置了许多用于对文件进行读写的函数,这些函数构成了操作文件系统的API。

其中一些常用的文件I/O函数包括os.Open():打开文件,os.Close():关闭文件,os.Create():创建新文件,os.Remove():删除文件等。

3.时间和日期函数Go语言内置了一些函数用于处理时间和日期。

这些函数允许开发人员获取当前时间,格式化日期和时间,并执行各种时间计算操作。

其中一些常用的时间和日期函数包括time.Now():返回当前时间,time.Parse():将字符串解析成时间,time.Sleep():阻塞一定时间等。

4.正则表达式函数Go语言支持正则表达式,这使得我们能够编写更灵活和强大的模式匹配功能。

其中一些常用的正则表达式函数包括pile():编译正则表达式,regexp.Match():匹配正则表达式,regexp.ReplaceAll():替换正则表达式等。

5.网络函数在Go语言中,我们可以轻松地构建服务器和客户端应用程序,使用Go标准库进行网络编程。

go发生空指针引用 recover处理方式

go发生空指针引用 recover处理方式

空指针引用是在 Go 语言中常见的错误之一,也是编程中经常遇到的问题。

在本文中,将详细介绍空指针引用的含义、产生原因以及在 Go 语言中如何处理空指针引用问题,特别是通过 recover 函数来处理空指针引用的方法。

一、空指针引用的含义在 Go 语言中,空指针引用指的是当程序试图访问一个指向空位置区域的指针时所引发的错误。

当程序中的指针变量未被正确初始化或者被显式赋值为 nil 时,如果程序尝试通过该指针变量来访问内存中的数据,就会产生空指针引用的错误。

这种错误可能会导致程序崩溃或者产生未定义的行为,因此在编程中需要格外小心避免空指针引用的发生。

二、空指针引用的产生原因1. 未初始化指针变量:在声明指针变量后,未对其进行正确的初始化操作,直接使用未初始化的指针变量进行访问操作会导致空指针引用的错误。

2. 显式赋值为 nil:在程序中将指针变量赋值为 nil,然后再尝试通过该指针变量访问内存中的数据,同样会引发空指针引用错误。

三、在 Go 语言中处理空指针引用的方法在 Go 语言中,我们通常可以通过以下几种方式来处理空指针引用的问题:1. 使用 if 语句判断指针是否为 nil:在程序中,在对指针变量进行访问前,可以使用 if 语句先判断指针是否为 nil,如果为 nil 则不进行访问操作,从而避免空指针引用错误的发生。

2. 使用 defer 和 recover 处理空指针引用错误:在 Go 语言中,可以使用 defer 和 recover 结合的方式来处理空指针引用错误。

当程序中发生空指针引用错误时,会触发 panic,这时可以使用 recover 函数来捕获 panic,并进一步处理该错误,保证程序的正常执行。

四、通过 recover 处理空指针引用错误的方法1. 在程序中使用 defer 关键字延迟执行 recover 函数来捕获可能发生的空指针引用错误。

2. 使用 recover 函数捕获 panic,并进一步处理空指针引用的错误情况,比如输出错误信息、进行日志记录或者进行其他相关操作。

Golang错误和异常处理的正确姿势

Golang错误和异常处理的正确姿势

Golang错误和异常处理的正确姿势Golang错误和异常处理的正确姿势错误和异常是两个不同的概念,⾮常容易混淆。

很多程序员习惯将⼀切⾮正常情况都看做错误,⽽不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误。

从表⾯上看,⼀切皆错误的思路更简单,⽽异常的引⼊仅仅增加了但事实并⾮如此。

众所周知,Golang遵循“少即是多”的设计哲学,追求简洁优雅,就是说如果异常价值不⼤,就不会将异常加⼊到语⾔特性中。

错误和异常处理是程序的重要组成部分,我们先看看下⾯⼏个问题:1. 错误和异常如何区分?2. 错误处理的⽅式有哪⼏种?3. 什么时候需要使⽤异常终⽌程序?4. 什么时候需要捕获异常?5. ...如果你对这⼏个问题的答案不是太清楚,那么就抽⼀点时间看看本⽂,或许能给你⼀些启发。

face-to-exception.png基础知识错误指的是可能出现问题的地⽅出现了问题,⽐如打开⼀个⽂件时失败,这种情况在⼈们的意料之中;⽽异常指的是不应该出现问题的地⽅出现了问题,⽐如引⽤了空指针,这种情况在⼈们的意料之外。

可见,错误是业务过程的⼀部分,⽽异常不是Golang中引⼊error接⼝类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含error。

error处理过程类似于C语⾔中的错误码,可逐层返回,直到被处理。

Golang中引⼊两个内置函数panic和recover来触发和终⽌异常处理流程,同时引⼊关键字defer来延迟执⾏defer后⾯的函数。

⼀直等到包含defer语句的函数执⾏完毕时,延迟函数(defer后的函数)才会被执⾏,⽽不管包含defer语句的函数是通过return的正常结束,还是由于panic导致的异常结束。

你可以在⼀个函数中执⾏多条defer语句,它们的执⾏顺序与声明顺序相反。

当程序运⾏时,如果遇到引⽤空指针、下标越界或显式调⽤panic函数等情况,则先触发panic函数的执⾏,然后调⽤延迟函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

go recover函数
一、概述
在Go语言中,recover函数是一种用于捕获并处理Go协程中的异常的机制。

当协
程出现异常时,recover函数可以从异常中恢复并继续执行后续的代码。

本文将详
细介绍recover函数的使用方式、原理以及注意事项。

二、recover函数的使用方式
recover函数的使用方式非常简单,只需要在可能引发异常的地方使用defer关键
字将recover函数注册到协程中即可。

当协程中发生异常时,recover函数会被调用,返回异常的值,然后程序可以根据异常的值进行相应的处理。

以下是recover函数的基本语法:
func recover() interface{}
三、recover函数的原理
在Go语言中,异常处理是通过panic和recover两个函数来实现的。

当协程中发生异常时,会触发一个panic,然后程序会从panic中恢复并继续执行后续的代码。

recover函数的作用就是在发生panic时,捕获并返回panic的值,然后程序可以根据返回的值进行相应的处理。

如果没有发生panic,或者recover函数没有被调用,那么recover函数会返回nil。

需要注意的是,recover函数只能在defer函数中调用才有效。

如果在普通的函数
中调用recover函数,它将不会起作用。

四、recover函数的注意事项
在使用recover函数时,需要注意以下几点:
1. recover函数只能在defer函数中调用
recover函数只有在defer函数中才能起作用。

如果在普通的函数中调用recover函数,它将不会捕获到异常。

2. recover函数只能捕获最近的异常
recover函数只能捕获最近的异常,不能用于捕获其他协程中的异常。

3. recover函数只能在相同的协程中起作用
recover函数只能在相同的协程中起作用。

如果在一个协程中发生了异常,其他协程中的recover函数无法捕获该异常。

4. recover函数只能在延迟函数中调用
recover函数只能在延迟函数中调用。

如果在普通的函数中调用recover函数,它将不会起作用。

五、示例代码
以下是一个使用recover函数的示例代码:
package main
import "fmt"
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("捕获到异常:", r)
}
}()
panic("发生了一个异常")
}
在上述代码中,我们在main函数中使用defer关键字将一个匿名函数注册到协程中。

当协程中发生异常时,recover函数会被调用,并且返回异常的值。

然后我们可以根据异常的值进行相应的处理。

在这个例子中,我们只是简单地打印了异常的值。

六、总结
通过recover函数,我们可以在Go语言中捕获并处理协程中的异常。

recover函数的使用非常简单,只需要在可能引发异常的地方使用defer关键字将recover函数注册到协程中即可。

但需要注意的是,recover函数只能在defer函数中调用,而且只能捕获最近的异常。

在使用recover函数时,我们需要遵循一些注意事项,比如recover函数只能在相同的协程中起作用,只能在延迟函数中调用等。

通过合理地使用recover函数,我们可以更好地处理和恢复协程中的异常,提高程序的稳定性和可靠性。

相关文档
最新文档