Golang-interface(二 接口与nil)

github: https://github.com/ZhangzheBJUT/blog/blob/master/nil.md

一 接口与nil

前面讲解了go语言中接口的基本使用方法,下面将说一说nil在接口中的使用。

从上面一节我们知道在底层,interface作为两个成员实现:一个类型和一个值。该值被称为接口的动态值, 它是一个任意的具体值,而该接口的类型则为该值的类型。对于 int 值3, 一个接口值示意性地包含(int, 3)。

只有在内部值和类型都未设置时(nil, nil),一个接口的值才为 nil。特别是,一个 nil 接口将总是拥有一个 nil 类型。若我们在一个接口值中存储一个 int 类型的指针,则内部类型将为 int,无论该指针的值是什么,这样的接口值会是非 nil 的,即使在该指针的内部值为 nil,形如(*int, nil)。

下面是一个错误的错误返回方式:

func returnsError() error {
    var p *MyError = nil
    if bad() {
        p = ErrBad
    }

    return p // Will always return a non-nil error.
}

这里 p 返回的是一个有效值(非nil),值为 nil。

因此,下面判断错误的代码会有问题:

func main() {
    if err := returnsError(); err != nil {
        panic(nil)
    }
}

上面的if判断永远为真,因为resturnsError返回的值的类型不为nil。

针对 returnsError 的问题,可以这样处理(不建议的方式):

func main() {
    if err := returnsError(); err.(*MyError) != nil {
        panic(nil)
    }
}

在判断前先将err转型为*MyError,然后再判断err的值。 类似的C语言空字符串可以这样判断:

bool IsEmptyStr(const char* str) {
    return !(str && str[0] != ‘\0‘);
}

但是Go语言中标准的错误返回方式不是returnsError这样。 下面是改进的returnsError:

func returnsError() error {

    var p *MyError = nil
    if bad() {
        return nil
    }
    return p // Will always return a non-nil error.
}

二 小结

在处理错误返回值的时候,一定要将正常的错误值转换为 nil。

参考:  http://golang.org/doc/faq#nil_error

Golang-interface(二 接口与nil)

时间: 2024-10-07 08:20:06

Golang-interface(二 接口与nil)的相关文章

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

java web开发(二) 接口开发

java web开发(一) 环境搭建讲解了如何搭建基础项目,如果你还没了解,可以先去看看!今天我们就来看看接口的开发,打算使用比较古老的或者说比较原始方法实现的接口. 一.数据库设计. 我打算做一个简单的学生信息管理系统,数据库名为students_manage,并且先设计一张学生表,表名为student. 1.打开Sqlyong工具,如果还没创建连接,可以点击新建,输入名称,点击确定即可, 2.然后在保存的连接中选择,刚刚新建的连接,只需要在密码输入框中输入,安装数据库时的设置的密码,点击连接

Java8 Lambda - Functioanl Interface 函数式接口

在java 8 里面新增了functional interface 这个概念.并且添加了新的annotation @FunctionalInterfaceI 1 什么是functional interface 函数式接口了? functional interface : functional interface only have 1 abstract method. 这就是函数接口的定义.简单明白,函数接口其实就是一个抽象方法的接口(interface). 2 函数式接口的类型 这里我只介绍基

Java的接口Interface和接口实现Implentmens的理解

长期从事CS的开发,从2005年开始买Java的书籍到现在9年了,一直都是门外汉,什么时候可以达到我CS开发中信手拈来,游刃有余的境界,必须得坚持和奋斗,因为除了这个别的我什么也不会. 我多做一点,月月就多点台阶. 首先 Interface也是Java的一种类. Java类不能多继承,但是可以实现多个Interface. 如果有多个不同的对象要实现某个相同的功能,那么可以先把这个功能抽象为一个接口. 如何判断由哪种具体的对象来实现这个接口功能呢,可以写一个判断类,由这个判断类读取配置文件的标识信

用关键字interface定义接口,通过关键字implements来实现接口

[定义]Java中,能够完成特定功能的,由若干属性和方法组织成的,相对独立的属性和方法的集合. [用途]实现类的多继承,以解决Java只能单继承,不支持多继承的问题. [特点] 用关键字interface定义接口,通过关键字implements来实现接口: 接口中的成员变量具有公共性(public).静态性(static)和最终性(final).所以修饰符只能是public,因此只能定义常量 实现多接口的类必须符合3个原则:能为所有的接口提供实现的功能, 能遵循重写的所有规则, 能保持相同的返回

golang interface接口

package main import "fmt" type Shaper interface { Area() float32 } type Square struct { side float32 } func (sq *Square) Area() float32 { return sq.side * sq.side } func main() { sq1 := new(Square) sq1.side = 5 var areaIntf Shaper areaIntf = sq1

golang interface

什么是接口? 简单的说,interface是一组method签名的组合,我们通过interface来定义对象的一组行为.interface类型定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口 .     Go中的接口为指定对象的行为提供了一种方式:如果事情可以这样做,那么它就可以在这里使用.我们已经看到一些简单的例子:自定义的打印可以通过String() 方法来实现,而Fprintf 可以通过Write 方法输出到任意的地方.只有一个或两个方法的接口在Go代码中很常见

SPI(Service Provider Interface)--通过接口获取服务

spi 现在已有实现 jdk 提供实现 dubbo里的spi实现 一.jdk实现 配置 定义接口 定义实现类 配置资源文件 classpath下创建(META-INF/services/接口全面:META-INF/services/spring.design.mode.test4.spi.DogService) 调用方法 ServiceLoader<DogService> loaders = ServiceLoader.load(DogService.class); for (DogServi

Golang(二)基本概念

类型 18个基本类型:bool.string.rune.byte.int.uint.int8.uint.int8.int16.uint16.int32.uint32.int64.uint64.float64.complex64.complex128 7个复合类型:array.struct.function.interface.slice.map.channel 其中,slice.map 和 channel 都是引用类型 最后,还有一种无符号的整数类型 uintptr,没有指定具体的 bit 大小