数据类型的默认值是什么??基本数据类型有默认值吗?之前我们聊过go语言的interface以及反射,今天说一下go语言中的nil,nil和interface有什么关系。这里我们可以看到,某些类型的默认值和其他语言是不一样的,我们在使用过程中需要注意一下。还有就是struct,其默认值就是其字段对应类型的默认值。
我们之前讲过go语言中的接口和反射。今天我们来谈谈nil,nil和go语言中的接口是什么关系。
我们先来看看go语言中数据类型的默认值是什么:
这里我们可以看到有些类型的默认值和其他语言是不一样的,在使用过程中需要注意。有struct,其默认值是其字段对应类型的默认值。这里主要看nil,它只能赋给指针、通道、func、接口、map或slice类型的变量,否则会引发panic。
那么我们来看看slice和map与nil的关系。首先,看代码:
看看运行结果:
这里可以看到,对于map和slice两种不同的声明方法,结果也是不同的。对于没有用“:=”声明的变量,结果是一个nil,因为这相当于只有一个指针,指向一个空映射,所以是一个nil。对于其他方法(mapa和s2),它的指针已经指向一个地图或切片,但是它的内容。也就是说,空的映射或切片肯定不是nil(结构也是)。
让我们回头看看界面。一般来说,它的数据结构由两部分组成,一部分是其特定类型的指针,另一部分是其特定数据的指针。我们可以通过反射找到它运行时的具体内容。好了,让我们来看看下面的代码:
你可以先猜猜结果是什么,3,2,1。让我们来看看结果:
不知道是不是和大家预期的一样?
我在这里解释一下。首先这里的var s *Student,s是一个空指针,它指向的内容是空的。这个上面也解释过了。主要是var n namer=s的部分,你可能觉得s指向空,所以给了n,所以n也应该指向空。其实n是一个接口类型,接口类型数据结构有两部分,类型和值。我们把s给n之后,n的内存数据发生了变化,也就是n的类型变成了s的类型(* main.student),但是它的值还是nil。也就是说,接口类型只有在其类型和值为零时才为零,所以对于S来说不为零.这个时候我们回忆一下接口的数据结构,它指向特定类型的指针和指向特定数据的指针是否更容易理解。只有这两个指针是nil,它们的接口类型object是nil。
这里还有一个小建议给你。如果在项目中遇到类似的问题,我们有两个角度来解决。第一,如果函数返回一个接口类型,要注意是否有是否等于nil的判断。如果有,要引起重视。这是个坑。个人不建议从这个角度处理。go语言的一个特点是支持多个返回值。最常见的是一个返回值加上一个错误。我们先判断错误,再处理退货的具体内容。逻辑不清晰,不容易出问题。我们很容易发现问题。我们要好好利用围棋语言的特点。不管是什么语言,什么工具,什么框架,都要知道它的主要功能特点才能得心应手。
(头条的代码支持还是比较头疼的。)更多资讯请关注微信官方账号:Go语之美。
本文来自网络,不代表「专升本要什么条件_专升本要几年_成人高考专升本_山东专升本信息网」立场,转载请注明出处:http://www.sdzsb8.cn/sbwd/26463.html