复合数据类型

# 数组

`q:=[...]int{1,2,3}`

如果省略号出现在数组长度的位置,那么数组的长度由初始化数组的元素个数决定。

`r:=[...]int{99:-1}`

定义了一个拥有100个元素的数组r,除了最后一个元素值是-1外,该数组中的其他元素值都是0

如果一个数组的元素类型是可比较的,那么这个数组也是可比较的,这样我们就可以直接使用==操作符来比较两个数组,比较的结果是两边元素的值是否完全相同。

 

go把数组和其他的类型都看成值传递。而在其他的语言中,数组是隐式的使用引用传递

当然也可以显式地传递一个数组的指针给函数,这样在函数内部对数组的任何修改都会反映到原始数组上面

 

# slice

如果slice的引用超过了被引用对象的容量,即cap(s)那么会导致程序宕机。但是如果slice的引用超出了被引用对象的长度,即len(s),那么最终slice会比原slice长

 和数组不同的是,slice无法做比较,因此不能用==来测试两个slice是否拥有相同的元素,标准库里面提供了高度优化的函数bytes.Equal来比较两个字节slice([] byte)。但是对于其他类型

slice,我们必须自己写函数来比较

不仅仅是在调用append函数的情况下需要更新slice变量。另外,对于任何函数,只要又可能改变slice的长度或容量,抑或是使得slice指向不同的底层数组,都需要更新slice变量,为了正确地使用slice,必须记住,虽然底层数组的元素是间接引用的,但是slice的指针,长度和容量不是。要更新一个slice的指针,长度或容量必须使用如上所示的显式赋值。从这个角度看,slice并不是纯引用类型,而是像聚合类型。

# map

键不再map中,上面的操作也都是安全的。map使用给定的键来查元素,如果对应的元素不存在,就返回值类型的零值。

map元素不是一个变量,不可以获取它的地址,原因是map的增长可能会导致已有元素被重新散列至新的存储位置,这样就可能使得获取的地址无效

map的零值是nil,大多数的map操作都可以安全地在map的令旨nil上执行,包括查找元素,删除元素,获取map元素个数,执行range循环,因为这和空map的行为一致。但向零值map中设置元素会导致错误,设置元素之前,必须初始化map。

# 结构体

posted @ 2024-01-15 02:55  l2c  阅读(1)  评论(0编辑  收藏  举报