go panic时如何让函数返回数据?
现在有这样一个问题:某函数如果正常执行,返回0,如果panic,则返回1,怎么搞呢?
package main import "fmt" func test() int { defer func() { if err := recover(); err != nil { return 1 } }() var p *int *p = 0 return 0 } func main() { fmt.Println("ret is", test()) for {} }
这样显然不行,因为那个return 1是针对匿名函数的, 而非test函数。
来看一个巧妙的方法:
package main import "fmt" func test() (a int) { defer func() { if err := recover(); err != nil { a = 1 } }() var p *int *p = 0 return 0 } func main() { fmt.Println("ret is", test()) for {} }
OK.
不多说。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接
相关推荐
-
golang的空标识符理解
空白符(blank identifier) 空白符的产生可能是因为go不允许变量声明了但不使用.既然不想使用,何必声明变量呢,那就将变量用空白符代替,反正空白符就是用来抛弃的. 我们有时候看到这样的golang代码: import _ "net/http/pprof" 或 for _, c := range "11234" { log.Println(c) } 或 var _ io.Reader = (* XXX)(nil) //全局变量 或 var _ = Sui
-
为什么Go语言把类型声明放在后面?
关于类型,官网上有一段仔细地介绍了一下函数指针的部分,现在的设计比起 C 的语法,清晰很多. 也就是说,类型放在后面是为了更加清晰易懂.Rob Pike 曾经在 Go 官方博客解释过这个问题(查看原文:Go's Declaration Syntax),简略翻译如下(水平有限翻译的不对的地方见谅): 引言 Go语言新人常常会很疑惑为什么这门语言的声明语法(declaration syntax)会和传统的C家族语言不同.在这篇博文里,我们会进行一个比较,并做出解答. C 的语法 首先,先看看 C 的
-
在go中使用omitempty的代码实例
omitempty在go中的使用 直接上代码: package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Addr string `json:"addr,omitempty"` } func main() { p1 := Person{ N
-
strings命令分析浅谈Go和C++编译时的一点小区别
最近查一个bug, 用strings命令分析, 竟然出乎意料地没有结果, 非常纳闷. 最后根据这个线索查出了bug的根本原因. 1. 在C++中, 即使函数在代码层面没有被调用, 也会最终编译到二进制中, 用strings可以分析. #include <iostream> using namespace std; void fun() { printf("hello world\n"); // strings分析有结果 } int main() { return 0;
-
linux下搭建go环境的安装配置讲解
linux下搭建go环境很简单: 1.下载go1.2.1.linux-386.tar.gz,网上到处有类似包,并放到linux目录下. taogeqq@taogeqq-virtual-machine:~/myspace$ ls a.out go1.2.1.linux-386.tar.gz test.cpp test.go taogeqq@taogeqq-virtual-machine:~/myspace$ 2. 切换到root用户,在root下解压,解压即安装,多么绿色的软件啊: root@t
-
go for range遍历二维数组的示例
go for range 遍历二维数组 var arry [2][3] int for index,_ := range arry { fmt.Print(index) } 运行结果: 0 1 没有遍历所有的6个元素. 二维数组 arry 可以理解为:拥有两个 一维数组元素 的一维数组,所以以上只是遍历了其的两个元素,index分别是0 1,value是两个 拥有三个int类型元素 的一维数组. var arry [2][3] int for index,value := range arr
-
go for range坑和闭包坑的分析
看程序: package main import ( "fmt" "time" ) func main() { str := []string{"I","like","Golang"} for _, v := range str{ v += "good" } for k, v := range str{ fmt.Println(k, v) } time.Sleep(1e9) } 结果:
-
go代码实现买房贷款月供计算的方法
贷款金额:100元(先以100元为例,来对比下公积金贷款和商业贷款) 公积金贷款年利率: 3.25% 商业贷款的年利率: 4.90% 贷款期限:360个月(30年) 还款方式:等额本息 计算公式:之前推导过, 用等比数列搞起即可 go代码如下: package main import ( "fmt" "math" ) func get_pmt(f_interest_rate float64, term_number int, principal int) float
-
用go gin server来做文件上传服务
之前已经go get安装了gin, 现在来玩下用go gin server作图片上传服务, 代码目录如下: taoge:~/test_gin$ tree . |-- public |-- template | `-- select_file.html `-- test_gin_server.go 2 directories, 2 files taoge:~/test_gin$ test_gin_server.go内容: package main import ( "fmt" "
-
使用go gin来操作cookie的讲解
准确地说, 这个标题是有问题的, go gin只能给浏览器返回操作cookie的指令, 真正执行cookie操作的是浏览器. 但广泛地来讲, 说go gin操作cookie, 也是可以的(间接操作) 来看go gin代码: package main import ( "github.com/gin-gonic/gin" ) func main() { router := gin.Default(); router.GET("/read_cookie", func(c
随机推荐
- SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断
- Java控制语句之if、switch语句
- 解析iOS开发中的FirstResponder第一响应对象
- IOS 头文件导入-@class注意事项总结
- Python正则表达式常用函数总结
- JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
- WMLScript的语法基础
- SQL2000 事务回滚问题探讨
- MongoDB中强大的统计框架Aggregation使用实例解析
- Sql Server使用cursor处理重复数据过程详解
- Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
- JavaScript 高级篇之函数 (四)
- 详解vue axios中文文档
- NodeJS创建基础应用并应用模板引擎
- Windows服务器的基础安全加固方法(2008、2012)
- Android下修改SeekBar样式的解决办法
- Java中如何获取mysql连接的3种方法总结
- Laravel4中的Validator验证扩展用法详解
- php的日期处理函数及uchome的function_coomon中日期处理函数的研究
- PHP动态图像的创建