我的函数必须返回一个字符串,无论成功或恐慌。
func getDBStoreStatus() string{
var replyMessage string
defer func() string{
if err := recover(); err != nil {
replyMessage = "Error happend."
}
return replyMessage
}()
//do something to store row into DB
db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8")
newMessage, err := db.Prepare("INSERT .............
res, err := newMessage.Exec(...........
if err != nil {
panic(err)
}
replyMessage = "OK"
return replyMessage
}
如果由延迟部分处理恐慌,我怎么能返回一个字符串? 您可以看到延迟部分中的return语句无法正常工作。
答案 0 :(得分:1)
命名您的返回参数,然后您可以在defer
方法中设置它:
func getDBStoreStatus() (replyMessage string) {
defer func(){
if err := recover(); err != nil {
replyMessage = "Error happend."
}
}()
//do something to store row into DB
db, err := sql.Open("mysql", "user1:password@/databaseName?charset=utf8")
newMessage, err := db.Prepare("INSERT .............
res, err := newMessage.Exec(...........
if err != nil {
panic(err)
}
replyMessage = "OK"
return replyMessage
}
请参阅Defer, Panic and Recover上的Go Blog帖子:
但是,我并没有真正看到这一点。你可以这么做:
- 醇>
延迟函数可以读取并分配给返回函数的命名返回值。
在此示例中,延迟函数递增返回值i 在周围的函数返回后。因此,此函数返回2:
func c() (i int) { defer func() { i++ }() return 1 }
if err != nil {
return "Error happend."
}
而不是panic(err)
。