【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断
作者:互联网
先看看导致异常的代码:
package main
import (
"fmt"
"log"
)
type MyError1 struct{
MyErrorCode int
msg string
lastError error
}
func (e *MyError1)Error()string{
return fmt.Sprintf("code=%d", e.MyErrorCode)
}
func f11()(int32, error){
return 1, nil
}
func f33()(string, *MyError1){
return "", nil
}
func main() {
a, err := f11()
log.Println(a, err)
b, err := f33() //这里err的类型已经不是原来的类型了
if err!=nil{ //上一个函数已经返回了nil,但是这里却没办法用if判断
log.Println("xxxx", err)
log.Println(err.Error()) //调用nil的.Error()方法,导致崩溃
}
log.Println(b, err)
}
经yif同学介绍,搜索了这篇帖子来学习:golang interface判断为空nil
把代码修改成以下,问题解决:
方法1
package main
import (
"fmt"
"log"
"reflect"
)
type MyError1 struct{
MyErrorCode int
msg string
lastError error
}
func (e *MyError1)Error()string{
return fmt.Sprintf("code=%d", e.MyErrorCode)
}
func f11()(int32, error){
return 1, nil
}
func f33()(string, *MyError1){
return "", nil
}
func IsNil(i interface{}) bool {
vi := reflect.ValueOf(i)
if vi.Kind() == reflect.Ptr {
return vi.IsNil()
}
return false
}
func main() {
a, err := f11()
log.Println(a, err)
b, err := f33()
if !IsNil(err){
log.Println("xxxx", err)
log.Println(err.Error())
}
log.Println(b, err)
}
方法2
package main
import (
"fmt"
"log"
)
type MyError1 struct{
MyErrorCode int
msg string
lastError error
}
func (e *MyError1)Error()string{
return fmt.Sprintf("code=%d", e.MyErrorCode)
}
func f11()(int32, error){
return 1, nil
}
func f33()(string, *MyError1){
return "", nil
}
func main() {
a, err := f11()
log.Println(a, err)
b, myErr := f33()
if myErr!=nil {
log.Println("xxxx", myErr)
log.Println(myErr.Error())
}
log.Println(b, myErr)
}
标签:return,nil,err,神坑,golang,func,Println,log 来源: https://www.cnblogs.com/ahfuzhang/p/12925446.html