• Golang 空指针nil的方法和数据成员


    golang中,有一个特殊的指针值nil.

    如何使用nil没有方法和成员变量呢?

    下面来看下具体例子。

    程序中,定义结构体类型Plane, 将Plane类型的指针作为函数的参数,然后传入nil作为实参。
    在函数中,使用nil访问Plane的方法。

    package main
    
    import (
            "fmt"
    )
    
    
    type Plane struct {
            Num int
    }
    
    func (this *Plane) Fly1(){
            fmt.Println("Fly1......")
    }
    
    func main(){
    
            test(nil)
    }
    
    func test(pl *Plane) {
            pl.Fly1()
    }
    

    output:

    Fly1......
    

    可以看到,正常输出。

    添加一个Fly2的方法,定义如下:

    func (this *Plane) Fly2(){
            fmt.Println("Fly2......Num:", this.Num)
    }
    func test(pl *Plane) {
            pl.Fly2()
    }
    

    在该方法中,访问Plane的数据成员变量Num.

    看下输出结果:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1099302]
    
    goroutine 1 [running]:
    main.(*Plane).Fly2(...)
    	/Users/lanyang/workspace/mt_go_exercise/t.go:18
    main.test(0x0)
    	/Users/lanyang/workspace/mt_go_exercise/t.go:28 +0x82
    main.main()
    	/Users/lanyang/workspace/mt_go_exercise/t.go:23 +0x2a
    exit status 2
    

    可以看到,程序crash了。

    为什么nil访问方法可以,访问成员变量就会crash呢?

    关于nil的定义:

    // nil is a predeclared identifier representing the zero value for a pointer, channel, func, interface, map, or slice type.
    
    var nil Type // Type must be a pointer, channel, func, interface, map, or slice type
    

    指针类型的nil没有分配内存空闲,对于方法,不需要存储空间,而成员变量需要内存空间存放,所以当nil访问成员变量时,由于引用了无效的内存,所以crash.

  • 相关阅读:
    算法导论 第一章
    20155312 2016-2017-2 《Java程序设计》第七周学习总结
    Visual Studio 2005 搭建Windows CE 6.0环境之准备
    C#在winform中调用系统控制台输出
    C# 目录(文件夹)复制实现
    关于加强数据库安全的一些实践
    运维小白部署网站踩坑全过程
    jQuery学习之二 jQuery选择器
    运维系列之二 Linux文件种类和扩展名
    运维系列之一 Linux的文件与目录权限解析
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/11695680.html
Copyright © 2020-2023  润新知