采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
func main() {
//通过打印发现s 是有结构的 [] len=0,cap=0 //但是nil在objectc语言中也有定义是一个宏,值是0, //但是s是一个结构或者类型,按照c++的理解,只要一声明就会开辟内存 //或者说只有指针类型才会初始值为nil,但是go都是值类型 var s []int fmt.Println(s == nil) printArrary(s)
}
这个问题很好。答案是:nil是一个值。对于不同的类型,它实际上会分配不一样的数据结构。这个问题和另一个问题结合起来看。
我这里通过unsafe.SizeOf来查看nil的分配情况。https://go.dev/play/p/FBbFP1HKuZa
对于[]int,它的结构是:指向底层数组的指针,len,cap。指针和len, cap两个int各占8字节,所以总共分配了24字节。不管是nil还是通过make生成的切片。https://blog.csdn.net/Peerless__/article/details/121304665
对于interface,它的结构是一个指向类型信息的指针,一个指向数据的指针。我们在结构体的值类型中也查看过这两个信息。所以即使是nil,它一样会分配内存,两个指针,所以16字节。https://blog.csdn.net/dongqiang51/article/details/122691441
那么一般的指针类型比如*int,定义一个指针类型的变量,就会分配8个字节,其值为0。
好的,谢谢
判断等不等于nil,不同的类型所做的处理不一样,虽然在语法上我们只写了==
登录后可查看更多问答,登录/注册
语法+分布式爬虫实战 为转型工程师量身打造
3.7k 14
712 1
2.0k 1
1.1k 12