网站首页 > 文章中心 > 其它

go语言中的nil和空_go语言接口的nil判断

作者:小编 更新时间:2023-08-30 15:03:40 浏览量:114人看过

nil和Nil及NULL的区别?

①.、NULL具有通用性

NULL其实就是C\C++的用法,用来表示一个对象指针不指向任何对象,其值为0,当在对象指针为NULL的对象上调用方法或访问成员变量时,会抛异常.

NIL?- Null-pointer to objective- c class

NIL?特对于表示Object-C的Class类型对象为NULL,表示其对象指针不指向任何对象.

go语言中的nil和空_go语言接口的nil判断-图1

nil?- Null-pointer to objective- c object

nil?特对于表示Object-C的除Class类型外的对象为NULL,表示其对象指针不指向任何对象.NSArray末用nil来表示结束.

因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值.如要确实需要存储一个表示"什么都没有"的值,可以使用NSNull类.

NSNull是一个类,它只有一个方法:+ (NSNull *) null;

[NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值. ? [NSNull null]是一个对象,用来表示空,他用在不能使用nil的场合.

扩展资料:

nil与Nil可以简单的理解为Object-C自己搞的对objective- c的NULL表示,用来表示一个对象指针不指向任何对象.

但是当在对象指针为nil?或NIL的对象上调用方法或访问成员变量时,返回NO,不会抛异常,程序将继续执行下去.

发给nil对象的消息返回值取决于其方法的返回类型.如果返回方法返回某个指针类型(例如对象指针),则返回值是nil.表示安全地将消息传递给了nil对象-nil仅起着传递作用.如果返回方法是返回类型长度和指针类型相等或更小的int话,返回值是零.如果返回值是浮点类型或结构体的话,将得到某个未定义的结果.

go语言中的nil和空_go语言接口的nil判断-图2

讲讲go语言的结构体

作为C语言家族的一员,go和c一样也支持结构体.可以类比于java的一个POJO.

在学习定义结构体之前,先学习下定义一个新类型.

这里要引入一个底层类型的概念.

如果一个新类型是基于某个 Go 原生类型定义的, 那么我们就叫 Go 原生类型为新类型的底层类型

在上面的例子中,int就是T1的底层类型.

底层类型是很重要的,因为对两个变量进行显式的类型转换,只有底层类型相同的变量间才能相互转换.底层类型是判断两个类型本质上是否相同的根本.

这种类型定义方式通常用在 项目的渐进式重构,还有对已有包的二次封装方面

类型别名表示新类型和原类型完全等价,实际上就是同一种类型.只不过名字不同而已.

一般我们都是定义一个有名的结构体.

字段名的大小写决定了字段是否包外可用.只有大写的字段可以被包外引用.

还有一个点提一下

如果换行来写

new返回的是一个指针.然后指针可以直接点号赋值.这说明go默认进行了取值操作

如上定义了一个空的结构体Empty.打印了元素e的内存大小是0.

有什么用呢?

基于空结构体类型内存零开销这样的特性,我们在日常 Go 开发中会经常使用空 结构体类型元素,作为一种"事件"信息进行 Goroutine 之间的通信

这种以空结构体为元素类建立的 channel,是目前能实现的、内存占用最小的 Goroutine 间通信方式.

这种形式需要说的是几个语法糖.

语法糖1:

go语言中的nil和空_go语言接口的nil判断-图3

对于结构体字段,可以省略字段名,只写结构体名.默认字段名就是结构体名

这种方式称为 嵌入字段

如果是以嵌入字段形式写的结构体

可以省略嵌入的Reader字段,而直接访问ReaderName

此时book是一个各个属性全是对应类型零值的一个实例.不是nil.这种情况在Go中称为零值可用.不像java会导致npe

结构体定义时可以在字段后面追加标签说明.

tag的格式为反单引号

tag的作用是可以使用[反射]来检视字段的标签信息.

具体的作用还要看使用的场景.

比如这里的tag是为了帮助 encoding/json 标准包在解析对象时可以利用的规则.比如omitempty表示该字段没有值就不打印出来.

Go数据结构篇

①.、基本数据类型

bool

string

常量定义

(1)Go语言不允许隐式类型转换(不支持小位数类型向大位数类型转)

(1)不支持指针运算

+ - * / % ++ --(不支持前置++ --)

#== != = =

(1)比较数组

相同维数且含有形同个数元素的数组才可以比较

每个元素都相同的才相等

| ^

^ (按位置零) a (^b)

①. ^ 0 1

①. ^ 1 0

0 ^ 1 0

0 ^ 0 0

(1)循环

Go 语?仅?持循环关键字 for

数组截取,索引下标从0开始计数

a[开始索引(包含), 结束索引(不包含)]

切片内部结构

常?字符串函数

go语言中fmt.Println(s0==nil)什么意思?

对于某些类型的变量,如指针、切片、map、接口、通道、函数等,如果从未为它赋过值,则它将具有默认值nil.这句代码的意思就是,如果s0未初始化过,就打印true,否则打印false.

golang-指针类型

tips: *号,可以指向指针类型内存地址上的值,号,可以获取值类型的内存地址

每一个变量都有内存地址,可以通过变量来操作内存地址中的值,即内存的大小

go语言中获取变量的内存地址方法:通过 符号可以获取变量的地址

定义:普通变量存储的是对应类型的值,这些类型就叫值类型

定义:指针类型的变量存储的是?个地址,所以?叫指针类型或引?类型

b 是值类型,它指向的是内存地址上的值

a是指针类型,它指向的是b的内存地址

指针类型定义,语法: var 变量名 *类型

指针类型在定义完成后,默认为空地址,即空指针(nil)

在定义好指针变量后,可以通过***** 符号可以获取指针变量指向的变量

今天这一节的 *a 等价于 b,通过修改 *a ,最终修改的是值类型b的值

这里a,d是值类型,b,c是指针类型

d就相当于把a内存地址上值,在内存中从新开辟了一块空间存储,d和a互不影响

b,c相当于指向了a的内存地址,当使用*号引用出内存地址上的变量上,修改值得,a的值也会跟着改变

以上就是土嘎嘎小编为大家整理的go语言中的nil和空相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章