我的编程空间,编程开发者的网络收藏夹
学习永远不晚

golang 中的 nil的场景分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

golang 中的 nil的场景分析

源码中的 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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

golang 中的 nil的场景分析

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

下载Word文档

猜你喜欢

云计算领域中的Golang应用场景分析

Golang在云计算领域的应用场景分析概述随着云计算的快速发展,越来越多的企业和开发者开始关注如何利用云计算技术提高自身的业务效率和可扩展性。作为一门高效、并发性强的编程语言,Golang(即Go)在云计算领域的应用场景日益广泛。本文将分
云计算领域中的Golang应用场景分析
2024-01-29

Golang反射介绍及应用场景分析

go 语言中的反射功能允许程序在运行时检查和修改类型的结构。通过使用 type、value 和 reflect.kind,我们可以获取对象的类型信息、字段值和方法,还可以创建和修改对象。具体的操作方法包括:检查类型(typeof())、获取
Golang反射介绍及应用场景分析
2024-04-03

分析MySQL锁的适用场景

MySQL 锁的应用场景分析在开发应用程序时,常常需要对数据库进行读取和写入操作。然而,当多个用户同时对数据库进行操作时,就会出现并发访问的问题。为了保证数据的一致性和完整性,MySQL 提供了锁机制来控制对数据库的并发操作。本文将分析 M
分析MySQL锁的适用场景
2023-12-21

Vue中$set()的使用方法场景分析

由于Vue会在初始化实例时进行双向数据绑定,使用Object.defineProperty()对属性遍历添加getter/setter方法,所以属性必须在data对象上存在时才能进行上述过程,这样才能让它是响应的,这篇文章主要介绍了Vue中$set()的使用方法场景分析,需要的朋友可以参考下
2023-02-18

Linux中OpenSSL命令的应用场景分析

OpenSSL命令在Linux中广泛应用,可用于加密/解密数据、管理公钥/私钥、处理证书、数字签名、进行HTTPS通信和SSH连接,以及确保电子邮件安全和生成随机数。通过遵循最佳实践,例如使用强加密算法和安全存储私钥,可以有效利用OpenSSL命令保护数据并加强安全性。
Linux中OpenSSL命令的应用场景分析
2024-04-02

Spring事务失效的场景分析

这篇文章主要介绍“Spring事务失效的场景分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring事务失效的场景分析”文章能帮助大家解决问题。1)未被Spring管理使用Spring事务的前
2023-07-02

Java中多线程的ABA场景问题分析

这篇文章主要为大家介绍了Java中多线程的ABA场景问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-29

$stmt php在编程中的应用场景分析

标题:PHP中的$stmt对象在编程中的应用场景分析与实例讲解PHP中的$stmt对象(Statement Object)是PDO(PHP数据对象)扩展库中用来执行预处理语句的重要工具,它能够提高数据库操作的安全性和效率。在实际编程中,$
$stmt php在编程中的应用场景分析
2024-02-27

解析Golang中接口的使用场景和注意事项

Golang中接口的使用场景和注意事项解析Golang作为一门静态类型语言,引入了接口(interface)的概念,以便更好地支持面向对象的编程方式。接口在Golang中是一个非常重要的概念,在实际开发中经常用到。本文将从使用场景和注意事
解析Golang中接口的使用场景和注意事项
2024-01-24

golang中泛型的具体应用场景

泛型在 go 中的应用场景:集合操作:创建适用于任何类型的集合操作,例如过滤。数据结构:编写通用的数据结构,如队列,栈和映射,可存储和操作各种类型的数据。算法:编写通用的算法,如排序,搜索和归约,可处理不同类型的数据。Go 中泛型的具体应用
golang中泛型的具体应用场景
2024-05-04

JVM类加载场景的实例分析

JVM类加载场景的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录