返回顶部
首页 > 资讯 > 后端开发 > GO >GoLangnil与interface的空指针深入分析
  • 140
分享到

GoLangnil与interface的空指针深入分析

GoLangnilGoLanginterface空指针 2022-12-23 12:12:31 140人浏览 安东尼
摘要

目录nilslicemapinterface指针是否为空nil Go中,每个指针都有2个基本信息,指针的类型和指针的值(type,value);当执行==时,需要比较类型与值(只有类

nil

Go中,每个指针都有2个基本信息,指针的类型和指针的值(type,value);当执行==时,需要比较类型与值(只有类型与值都相等时,才会相等)。

nil并不是Go语言的关键字或者保留字,而是一个预定义好的标识符:

  • nil之间不能比较:nil==nil是不允许的,会抛出operator == not defined on untyped nil异常;
  • 不同类型的nil之间不能互相比较:如切片的nil,不能与map的nil做比较;
  • nil是map、slice、pointer、channel、func、interface的零值;
  • 不同类型nil值占用空间可能大小不同;

在64位机器上运行时nil的大小:

func main() {
    var p *struct{}
    fmt.Println(unsafe.Sizeof(p), p == nil) // 8
    var s []int
    fmt.Println(unsafe.Sizeof(s), s == nil) // 24
    var m map[int]bool
    fmt.Println(unsafe.Sizeof(m), m == nil) // 8
    var c chan string
    fmt.Println(unsafe.Sizeof(c), c == nil) // 8
    var f func()
    fmt.Println(unsafe.Sizeof(f), f == nil) // 8
    var i interface{}
    fmt.Println(unsafe.Sizeof(i), i == nil) // 16
}

slice

一个nil的slice,除了不能索引外,其他的操作都正常;当append元素时,slice会自动进行扩容。

slice是一个简单的结构体,包含(长度、容量、指向数组的指针);当slice为nil时,长度、容量都为0,指针为空。

map

一个nil的map,是一个真正的空指针,除len与for-range外,其他操作不能正常使用。

非nil的map,是一个指向内部HashMap的指针;空map(map[string]int{})与为nil的map是不同的,空map只是没有内容,可在上面做任何的map操作。

interface

interface底层由两部分组成(参见《golang反射简介》),一个是类型,一个值,也就是类似于:(Type, Value)。只有当类型和值都是nil的时候,才等于nil:

func inFun(v interface{}) {
    fmt.Println("fun-interface:", v == nil)
}
func main() {
    var a interface{}
    var b []string
    var c string
    fmt.Println(a == nil)
    inFun(a)    // true
    fmt.Println(b == nil)
    inFun(b)    // false
    //fmt.Println(c == nil) // can not compare with nil
    inFun(c)    // false
}
// true
// fun-interface: true
// true                
// fun-interface: false
// fun-interface: false

本身是interface时,传递interface参数,其nil属性不变;若是普通指针,则传递给interface参数时,都为非空(!=nil);

指针是否为空

那如何判定interface里面的动态值是否空?此时需要借助反射reflect来实现:

func nilCheck(v interface{}) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("panic:", err)
        }
    }()
    if v == nil {
        fmt.Println("nilCheck: interface is nil")
        return
    }
    vi := reflect.ValueOf(v)
    fmt.Println("nilCheck:", vi.IsNil())
}
func main() {
    var a interface{}
    var b []string
    var c string
    nilCheck(a)
    nilCheck(b)
    nilCheck(c)
}
// nilCheck: interface is nil
// nilCheck: true                                             
// panic: reflect: call of reflect.Value.IsNil on string Value

对于非指针类型,在反射后调用IsNil时会抛出异常。其实现:

func (v Value) IsNil() bool {
    k := v.kind()
    switch k {
    case Chan, Func, Map, Pointer, UnsafePointer:
        if v.flag&flagMethod != 0 {
            return false
        }
        ptr := v.ptr
        if v.flag&flagIndir != 0 {
            ptr = *(*unsafe.Pointer)(ptr)
        }
        return ptr == nil
    case Interface, Slice:
        // Both interface and slice are nil if first Word is 0.
        // Both are always bigger than a word; assume flagIndir.
        return *(*unsafe.Pointer)(v.ptr) == nil
    }
    panic(&ValueError{"reflect.Value.IsNil", v.kind()})
}

到此这篇关于GoLang nil与interface的空指针深入分析的文章就介绍到这了,更多相关GoLang nil内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GoLangnil与interface的空指针深入分析

本文链接: https://lsjlt.com/news/175641.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • GoLangnil与interface的空指针深入分析
    目录nilslicemapinterface指针是否为空nil Go中,每个指针都有2个基本信息,指针的类型和指针的值(type,value);当执行==时,需要比较类型与值(只有类...
    99+
    2022-12-23
    GoLang nil GoLang interface空指针
  • GoLang nil与interface的空指针怎么使用
    本篇内容介绍了“GoLang nil与interface的空指针怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!nilGo中...
    99+
    2023-07-04
  • C++深入分析讲解智能指针
    目录1.简介2.unique_ptr指针(独占指针)3.shared_ptr指针(共享所有权)4.weak_ptr(辅助作用)5.自实现初级版智能指针6.总结1.简介 程序运行时存在...
    99+
    2024-04-02
  • C语言基础野指针与空指针示例分析
    目录一:野指针野指针的成因1. 指针未初始化2. 指针越界访问3 .指针释放后未置空规避野指针1. 初始化指针 2. 避免指针越界 3 避免返回局部变量的地址 4. 开辟的指针释放后...
    99+
    2024-04-02
  • C语言深入分析数组指针和指针数组的应用
    目录一、数组类型二、定义数据类型三、数组指针四、指针数组五、小结一、数组类型 C语言中的数组有自己特定的类型数组的类型由元素类型和数组大小共同决定 例:int array[5] 的类...
    99+
    2024-04-02
  • C语言深入浅出分析函数指针
    我们先看一个代码: #include<stdio.h> void test() { printf("haha\n"); } int main() { printf("...
    99+
    2024-04-02
  • 深入理解c++指针的指针和指针的引用
    在C++中,指针是一种数据类型,可以存储变量的内存地址。指针的指针和指针的引用是两种特殊的指针类型。指针的指针是指一个指针变量的值是另一个指针的地址。也就是说,指针的指针存储的是一个指针变量的地址。可以通过多次间接引用来获取最终指向的变...
    99+
    2023-08-09
    c++
  • 分析空指针异常的原因与解决方法
    空指针异常的原因及解决方法探析导语:在程序开发过程中,我们经常会遇到一种常见的异常——空指针异常。当我们访问一个空对象的属性或调用空对象的方法时,就会抛出空指针异常。本文将探析空指针异常的原因,并给出相应的解决方法,同时提供具体的代码示例。...
    99+
    2023-12-28
    解决方法 原因 空指针异常 空指针异常的
  • C语言的野指针与空指针是什么
    这篇文章主要介绍“C语言的野指针与空指针是什么”,在日常操作中,相信很多人在C语言的野指针与空指针是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言的野指针与空指针是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • C/C++中指针的深入理解
    目录计算机的内存模型指针与指针常量指针变量和指针常量指针变量和数组函数指针C++中的引用传值还是传引用C++中的new关键词总结计算机的内存模型 CPU是计算机的核心部件,要想让一...
    99+
    2024-04-02
  • 深入理解C语言的指针
    目录起源进程内存布局栈设置分配方式特点堆分配方式特点堆与栈区别扩展总结起源 之前在知乎上看了一句话,指针是C的精髓,也是初学者的一个坎。换句话说,内存管理是C的精髓,C/C++可以直...
    99+
    2024-04-02
  • 深入了解Golang的指针用法
    目录1.指针类型的变量2.Go只有值传递,没有引用传递3.for range与指针4.闭包与指针5.指针与内存逃逸与C语言一样,Go语言中同样有指针,通过指针,我们可以只传递变量的内...
    99+
    2024-04-02
  • 深入解析Golang指针的用法,助你快速掌握
    Golang指针用法实例解析,让你快速上手 概述:在Go语言中,指针是一种特殊的变量类型,它存储了一个内存地址。通过指针,我们可以直接访问内存中的数据,能够在函数之间分享数据。指针功能强大且灵活,但也容易出错...
    99+
    2024-01-24
    实例 上手 Golang指针
  • C语言深入讲解指针与结构体的使用
    目录1 啥是指针1.1指针与指针变量1.2总结2 指针和指针类型2.1指针+-整数3 野指针3.1 野指针的成因1指针未初始化2指针越界访问3指针指向的空间释放3.2 如何避免野指针...
    99+
    2024-04-02
  • Android中pendingIntent与Intent的深入分析
    Android中pendingIntent的深入分析 pendingIntent字面意义:等待的,未决定的Intent。 要得到一个pendingIntent对象,使用方法类...
    99+
    2022-06-06
    Android
  • 深入分析 Golang 与 Ruby 的异同
    go 与 ruby 的主要区别在于:go 是一种静态类型编译语言,支持轻量级并行和高效内存管理,适合编写高并发应用程序;ruby 是一种动态类型解释语言,支持真正的并行但内存管理需手动控...
    99+
    2024-05-12
    golang ruby
  • C++智能指针shared_ptr与weak_ptr的实现分析
    目录shared_ptrweak_ptr内存模型RefCnt 和 Mdel实现shared_ptr 实现weak_ptr 实现shared_from_this()循环引用shared...
    99+
    2024-04-02
  • C++深入讲解引用的特点及与指针的区别
    目录一.引入二.C++中较为麻烦的运算符三.引用的定义四.引用的特点五.对比指针与引用六.引用与指针的区别1.语法层面的区别2.汇编层面的区别七.引用的其他使用常引用数组引用指针引用...
    99+
    2024-04-02
  • 深入解析 C++ 函数指针:从原理到应用
    c++++ 函数指针是指向函数的内存区域,存储函数入口地址,允许动态调用。它们用于回调函数、事件处理和动态函数调用。例如,可以使用函数指针将字符串转换大写的函数 touppercase ...
    99+
    2024-04-30
    c++ 函数指针
  • Python 迭代器与生成器:针对面试的深入指南
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作