广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang 中的 nil的场景分析
  • 194
分享到

golang 中的 nil的场景分析

2024-04-02 19:04:59 194人浏览 八月长安
摘要

源码中的 nil 是这样定义的 // nil is a predeclared identifier representing the zero value for a // p

源码中的 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 可以理解为这些类型的零值,声明一个变量在没有赋值的情况下,变量处于零值状态。

场景一


func t1() {
 var i interface{}
 var p *int

 fmt.Println("p==i", p == i)
 fmt.Println("i=", i, "i==null", i == nil)
 fmt.Println("p=", p, "p==nil", p == nil)
 fmt.Println("i TypeOf=", reflect.TypeOf(i), "i ValueOf", reflect.ValueOf(i))
 fmt.Println("p TypeOf=", reflect.TypeOf(p), "p ValueOf", reflect.ValueOf(p))
 i = p
 fmt.Println("---")
 fmt.Println("p==i", p == i)
 fmt.Println("i=", i, "i==null", i == nil)
 fmt.Println("p=", p, "p==nil", p == nil)
 fmt.Println("i TypeOf=", reflect.TypeOf(i), "i ValueOf", reflect.ValueOf(i))
 fmt.Println("p TypeOf=", reflect.TypeOf(p), "p ValueOf", reflect.ValueOf(p))

}

真相是 i 刚开始没有类型,而 p 是有类型,所以 p 和 i 都等于 nil,但是 == 可以理解为 PHP 或者 js 里面的 === 全等,既要类型相等,也要值相等。

在 i = p 之后,p 和 i 类型和值保持了一致所以会相等,但是 i 已经不等于 nil 了,因为 nil 是 interface 的 0 值,或者说 i 已经指向 p ,i 现在是个有类型状态而非 0 值状态。

结果如下

p==i false
i= <nil> i==null true
p= <nil> p==nil true
i TypeOf= <nil> i ValueOf <invalid reflect.Value>
p TypeOf= *int p ValueOf <nil>
---
p==i true
i= <nil> i==null false
p= <nil> p==nil true
i TypeOf= *int i ValueOf <nil>
p TypeOf= *int p ValueOf <nil>

场景二


func t3() {
 f1 := func(i interface{}) bool {
  return i == nil
 }

 var a *int
 fmt.Println(f1(a)) // false
 fmt.Println(f1(nil)) // true
}

a 传递到 func 里面,被转成 interface,这个 interface 是有类型的 interface,相当于赋值了一下 i=a ,所以 i 的状态不是 interface 的零值状态 ,和 interface 零值状态的 nil 当然是不相等

场景三


type A struct {
}

func (A) a1() int {
 return 123
}

func (*A) a2() int {
 return 321
}

type B interface {
}

func t2() {
 var a A
 var ap *A
 var b B
 var bp *B

 fmt.Println("a=", a, "a.a1()", a.a1(), a.a2()) //a= {} a.a1() 123 321; a == nil 会抛错 struct 不能和 nil 进行比较
 fmt.Println("ap=", ap, "ap==nil", ap == nil) //ap= <nil> ap==nil true

 fmt.Println("b=", b, " b==nil:", b == nil)  // b= <nil> b==nil: true
 fmt.Println("bp=", bp, " bp==nil:", bp == nil) //bp= <nil> bp==nil: true
}

结构体的 0 值为 {}

到此这篇关于golang 中的 nil的场景分析的文章就介绍到这了,更多相关Golang 中的 nil内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang 中的 nil的场景分析

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang 中的 nil的场景分析
    源码中的 nil 是这样定义的 // nil is a predeclared identifier representing the zero value for a // p...
    99+
    2022-11-11
  • 一文浅析Golang中的nil和零值
    作为一个长期从事Java开发的人员,我痴迷于null检查和处理null值。在golang中,故事有些不同。在这篇文章中,我将尝试描述在golang中如何使用nil和零值。非空和空类型在go中类型可以是空或非空。 非空类型永远不能为nil,并...
    99+
    2023-05-14
    nil Golang go语言
  • Golang函数的高阶函数应用场景分析
    随着Golang语言的流行和发展,越来越多的开发者开始尝试使用函数式编程的思想。Golang中的高阶函数为函数式编程带来了很大的便利性,并且在实际开发中应用广泛。那么,Golang函数的高阶函数应用场景是什么呢?接下来,我们将对此进行分析。...
    99+
    2023-05-17
    Golang 应用场景分析 高阶函数
  • Golang函数的匿名函数应用场景分析
    作为一门现代化的编程语言,Golang(又称Go语言)具有众多强大的特性。其中,匿名函数是Golang的一个非常重要的概念,被广泛应用于各种场景中。在本文中,我们将深入分析Golang函数中匿名函数的应用场景。事件处理器在事件处理器中,匿名...
    99+
    2023-05-16
    Golang 匿名函数 应用场景分析
  • React中的Context应用场景分析
    Context定义和目的 Context 提供了一种在组件之间共享数据的方式,而不必显式地通过组件树的逐层传递 props。 应用场景 哪些数据会需要共享? Context 设计目...
    99+
    2022-11-12
  • golang中的nil接收器详解
    我们先看一个简单的例子,我们自定义一个错误,用来把多个错误放在一起输出: type CustomError struct {errors []string} func (c *Cus...
    99+
    2022-11-11
  • 分析MySQL锁的适用场景
    MySQL 锁的应用场景分析在开发应用程序时,常常需要对数据库进行读取和写入操作。然而,当多个用户同时对数据库进行操作时,就会出现并发访问的问题。为了保证数据的一致性和完整性,MySQL 提供了锁机制来控制对数据库的并发操作。本文将分析 M...
    99+
    2023-12-21
    MySQL 分析
  • SQL语句中JOIN的用法场景分析
    记录:256 写SQL最高境界:SELECT * FROM 表名。当然这是一句自嘲。探究一下SQL语句中JOIN的用法,直到经历这个场景,变得想验证一下究竟。 一、场景 把关...
    99+
    2022-11-12
  • springboot运行到dokcer中dockerfile的场景分析
    目录1.场景2.编写springboot项目打包上传linux服务器2.1将jar包和docker放到同一个目录2.2编写dockerfile3.运行dockerfile4.查看镜像...
    99+
    2022-11-13
  • Vue中$set()的使用方法场景分析
    目录Vue中$set()的使用方法前言$set()的应用场景一$set()的应用场景二补充:vue中$set的用法$set用于更新数组:$set用于更新对象:Vue中$set()的使...
    99+
    2023-02-18
    Vue中$set()使用 Vue中$set()用法 Vue中$set()
  • Spring事务失效的场景分析
    这篇文章主要介绍“Spring事务失效的场景分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring事务失效的场景分析”文章能帮助大家解决问题。1)未被Spring管理使用Spring事务的前...
    99+
    2023-07-02
  • Golang中的nil和零值怎么声明
    这篇文章主要讲解了“Golang中的nil和零值怎么声明”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中的nil和零值怎么声明”吧!非空和空类型在go中类型可以是空或非空。 非空...
    99+
    2023-07-05
  • Java中多线程的ABA场景问题分析
    目录前言一、异步场景常用工具二、CAS 与 ABA 问题三、用 JUC 工具处理 ABA 问题总结前言 本文是笔者在日常开发过程中遇到的对 CAS 、 ABA 问题以及 JUC(ja...
    99+
    2022-12-29
    Java 多线程ABA Java 多线程
  • SpringBoot集成EasyExcel的应用场景分析
    1、介绍 官网地址:https://www.yuque.com/easyexcel 特点: 1、Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他...
    99+
    2022-11-12
  • JVM类加载场景的实例分析
    JVM类加载场景的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JVM是Java Virtual  Machine(Java虚拟机)的缩写,J...
    99+
    2023-06-16
  • mapboxgl 中插值表达式的应用场景分析
    目录一、前言二、语法三、对地图颜色进行拉伸渲染1. 热力图2. 轨迹图2. 模型网格渲染四、随着地图缩放对图形属性进行插值五、interpolate的高阶用法六、总结一、前言 int...
    99+
    2022-11-13
  • Go中sync 包Cond使用场景分析
    目录背景Cond 简介使用示例Signal的使用场景Broadcast的使用场景注意事项背景 编写代码过程中, 通常有主协程和多个子协程进行协作的过程,比如通过 WaitGroup ...
    99+
    2023-03-03
    Go 使用 sync.cond go sync包cond使用
  • Vue中created和mounted使用场景分析
    目录一、生命周期概念二、浏览器渲染过程三、生命周期中的浏览器渲染beforeCreate阶段created阶段beforeMount阶段mounted阶段四、使用场景五、常见相关问题...
    99+
    2023-05-20
    Vue中created和mounted Vue created和mounted
  • drools的简单入门案例场景分析
    目录一、背景1.Drools介绍二、为什么要学习drools三、实现上方这个简单的打折案例1、引入jar包2、编写kmodule.xml配置文件3、编写规则文件1、规则文件的语法2、...
    99+
    2022-11-13
  • C#校验时间格式的场景分析
    目录前言:场景描述前戏一前戏二正戏尾戏前言: 晚上打算睡觉的时候,群里反馈订单接收失败,开工排查问题,日志显示验签失败,发现一个蛮有意思的BUG,总算有了一个写作的素材 场景描述 本...
    99+
    2022-11-13
    C#校验时间格式 C#时间格式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作