美文网首页
GO接口可能产生的空指针问题

GO接口可能产生的空指针问题

作者: soondh | 来源:发表于2020-09-25 10:27 被阅读0次

一个例子

package main

import (
    "bytes"
    "io"
)

func main() {
    var buf *bytes.Buffer
    var out io.Writer = buf

    if out != nil {
        out.Write([]byte("hello world!\n"))
    }
}

运行后报错

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x105f716]

goroutine 1 [running]:
bytes.(*Buffer).Write(0x0, 0xc000014090, 0xd, 0xd, 0x0, 0x1069860, 0xc00005e058)
        /usr/local/go/src/bytes/buffer.go:169 +0x26
main.main()
        /Users/root/workspcae/interface/interface.go:40 +0x7a
exit status 2

主要原因是 if out != nil 这个判断为true,但是out实际的可写入指针为nil

一个接口类型的值,包括动态类型动态值两个部分。在把一个变量隐式的转换为接口值时,我们要注意该变量的值是否为nil。如之前的例子,var buf *bytes.Buffer,buf的值为nil,但是隐式转换var out io.Writer = buf后,out的动态类型为*bytes.Buffer,动态值为nil,而接口类型的非空判断,必须动态类型和动态值都为nil。这就导致了上述空指针的panic

相关文章

  • GO接口可能产生的空指针问题

    一个例子 运行后报错 主要原因是 if out != nil 这个判断为true,但是out实际的可写入指针为ni...

  • 特殊数据类型

    指针 GO 语言像 C 一样有指针,可以通过指针访问数据,但是 GO 的指针要安全的多: 首先,访问空指针会直接报...

  • 空指针、野指针与悬垂指针

    空指针:指针指向的地址为空的指针叫空指针(NULL指针) 野指针:是指向“垃圾”内存(不可用内存)的指针产生原因:...

  • 第04天(面对对象编程)_04

    16_接口的继承.go 17_接口转换.go 18_空接口.go 19_类型断言:if.go 20_类型断言:sw...

  • C指针(1):指针和内存

    C指针 指针和内存 1.指针的声明 指向未初始化的内存的指针可能会产生问题。如果将这种指针解引,指针的内容可能并不...

  • go语言值传递与指针传递

    go语言指针 go语言作为静态编译型语言,具有指针类型,但是不提供对指针的移位危险操作,防止指针的越界等问题。 g...

  • Go-Pointer

    go 指针 声明指针类型 x 错误写法此时创建的是一个空指针,而空指针无法获取到内存地址,也就无法根据内存地址找到...

  • 异步调用Feign接口空指针问题

    异步调用Feign接口空指针问题原因: Feign接口的Request 默认是主线程和子线程不共享的,当异步调用F...

  • Go 接口与指针接收器的问题

    提示错误 因为我只实现*person的接口,而没实现person的接口,所以在sayHeight时,需要将p改为&p。

  • 项目问题集锦(1)

    构造对象空指针问题 原因:接口没有返回uniq字段,导致构造函数某些属性为null,崩溃.[java.lang.I...

网友评论

      本文标题:GO接口可能产生的空指针问题

      本文链接:https://www.haomeiwen.com/subject/spoxuktx.html