①.、NULL具有通用性
NULL其实就是C\C++的用法,用来表示一个对象指针不指向任何对象,其值为0,当在对象指针为NULL的对象上调用方法或访问成员变量时,会抛异常.
NIL?- Null-pointer to objective- c class
NIL?特对于表示Object-C的Class类型对象为NULL,表示其对象指针不指向任何对象.
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话,返回值是零.如果返回值是浮点类型或结构体的话,将得到某个未定义的结果.
作为C语言家族的一员,go和c一样也支持结构体.可以类比于java的一个POJO.
在学习定义结构体之前,先学习下定义一个新类型.
这里要引入一个底层类型的概念.
如果一个新类型是基于某个 Go 原生类型定义的, 那么我们就叫 Go 原生类型为新类型的底层类型
在上面的例子中,int就是T1的底层类型.
底层类型是很重要的,因为对两个变量进行显式的类型转换,只有底层类型相同的变量间才能相互转换.底层类型是判断两个类型本质上是否相同的根本.
这种类型定义方式通常用在 项目的渐进式重构,还有对已有包的二次封装方面
类型别名表示新类型和原类型完全等价,实际上就是同一种类型.只不过名字不同而已.
一般我们都是定义一个有名的结构体.
字段名的大小写决定了字段是否包外可用.只有大写的字段可以被包外引用.
还有一个点提一下
如果换行来写
new返回的是一个指针.然后指针可以直接点号赋值.这说明go默认进行了取值操作
如上定义了一个空的结构体Empty.打印了元素e的内存大小是0.
有什么用呢?
基于空结构体类型内存零开销这样的特性,我们在日常 Go 开发中会经常使用空 结构体类型元素,作为一种"事件"信息进行 Goroutine 之间的通信
这种以空结构体为元素类建立的 channel,是目前能实现的、内存占用最小的 Goroutine 间通信方式.
这种形式需要说的是几个语法糖.
语法糖1:
对于结构体字段,可以省略字段名,只写结构体名.默认字段名就是结构体名
这种方式称为 嵌入字段
如果是以嵌入字段形式写的结构体
可以省略嵌入的Reader字段,而直接访问ReaderName
此时book是一个各个属性全是对应类型零值的一个实例.不是nil.这种情况在Go中称为零值可用.不像java会导致npe
结构体定义时可以在字段后面追加标签说明.
tag的格式为反单引号
tag的作用是可以使用[反射]来检视字段的标签信息.
具体的作用还要看使用的场景.
比如这里的tag是为了帮助 encoding/json 标准包在解析对象时可以利用的规则.比如omitempty表示该字段没有值就不打印出来.
①.、基本数据类型
bool
string
常量定义
(1)Go语言不允许隐式类型转换(不支持小位数类型向大位数类型转)
(1)不支持指针运算
+ - * / % ++ --(不支持前置++ --)
#== != = =
(1)比较数组
相同维数且含有形同个数元素的数组才可以比较
每个元素都相同的才相等
| ^
^ (按位置零) a (^b)
①. ^ 0 1
①. ^ 1 0
0 ^ 1 0
0 ^ 0 0
(1)循环
Go 语?仅?持循环关键字 for
数组截取,索引下标从0开始计数
a[开始索引(包含), 结束索引(不包含)]
切片内部结构
常?字符串函数
对于某些类型的变量,如指针、切片、map、接口、通道、函数等,如果从未为它赋过值,则它将具有默认值nil.这句代码的意思就是,如果s0未初始化过,就打印true,否则打印false.
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和空相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!