南君手记
  • 持续专注
  • Docker
    • Azure容器镜像代理服务失效
    • registry镜像加速器拉取谷歌镜像
    • 简单镜像加速
    • registry拉取dockerhub私有镜像
  • Golang
    • standard_init_linux.go:190: exec user process caused "no such file or directory
    • flota64后面保留三位小数
    • 数组赋值问题
    • append函数的使用方式
    • 错误返回非空的值
    • 数组类型转换
    • 强制类型转换
    • for循环之迭代变量
    • 切片长度
    • Map面试题
    • 指针方法&值方法
  • Gitbook
  • 油管知识汇
  • 穷查理宝典
    • 一些箴言
  • 自省
  • 技术调研
    • gomonkey
    • goconvey调研学习
    • Github认证调研
  • kubenetes
    • 利用NFS动态提供Kubernetes后端存储卷
    • k8s CRD(一)quick start
  • Tekton
    • Tekton Dashboard
    • tekton之Task&TaskRun概念篇
    • tekton简单介绍及安装
  • 哈佛的6堂独立思考课
由 GitBook 提供支持
在本页

这有帮助吗?

  1. Golang

错误返回非空的值

Why is my nil error value not equal to nil

算是面试题吧,对于理解golang的Interface有帮助,interface怎样才算空?var err error = nil,这样的申明,err就是空的了吗?答案是:当然是空啦,上代码,看结果会比较清楚

package main
import (
    "fmt"
    "github.com/go-openapi/errors"
)
​
func test1() error {
    var err error = nil
    if err != nil {
        return errors.New(200, "danger") //不会进
    }
    return err
}
func main() {
    t := test1()
    if t != nil {
        fmt.Println("true")
    } else {
        fmt.Println("false")
    }
}

结果为false。也就是返回是空的。

那我们看下面代码:

package main
​
import (
    "fmt"
    "github.com/go-openapi/errors"
)
​
type myError struct {
}
​
func (m myError)Error() string {//myError实现了error接口的Error方法
    return "test"
}
​
func test1() error {
    var err *myError = nil
    if err != nil {
        return errors.New(200, "danger") //不进
    }
    return err
}
​
func main() {
    t := test1()
    if t != nil {
        fmt.Println("true")
    } else {
        fmt.Println("false")
    }
}

结果是:true.第二个输出结果显示返回不为空。就是err的类型不一样,导致最后判空结果不一样,但是第二个例子中的err明明是Nil,不然会进test1()中的那个判空啊。原因是啥呢?

因为接口存储分为类型T和值V,V是具体值,例如我们将类型为int的3存储进接口,接口表现为T=INT,V= 3。接口只有当V为nil且T为nil时才会判为空。所以例2中test1()返回中,从*myError转换为error。所以error是要存储原数据类型的,返回结果为T=**myError,V= nil。最终显示该值不为空。

参看文章:https://golang.org/doc/faq#nil_error

上一页append函数的使用方式下一页数组类型转换

最后更新于5年前

这有帮助吗?