1.切片与数组
1.1. 切片其底层的实现就是数组。相当于是对数组进一步封装的数据结构,他有相关的方法操作数组和切片。
切片并不存储任何数据,它只是描述了底层数组中的一段。更改切片的元素会修改其底层数组中对应的元素。与它共享底层数组的切片都会观测到这些修改。
package main
import "fmt"
func main() {
names := [4]string{
"John",
"Paul",
"George",
"Ringo",
}
fmt.Println(names)
//output:[John Paul George Ringo]
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
//output:[John Paul] [Paul George]
b[0] = "XXX"
fmt.Println(a, b)
//output:[John XXX] [XXX George] 共享同一个names数组,所以会造成a切片也发生了变化
}
1.2. 切片和数组的语法命名上的差别
a := [2]int{0,1} //数组,初始化时就指定了大小
b := []int{} //切片,初始化时不指定大小
b = append(b,0) //通过append方式添加数据,其底层会动态分配空间,并返回一个新的数组空间(变大了),所以必须重新通过一个变量名来接收
1.3. 对切片的操作
在go中,切片是一种派生类型,但是他并没有实现自己的方法,既无法通过方法操纵切片,而是只能通过内建函数操作切片。(函数是类型外的定义,方法是绑定了具体类型的方法)。比如append、copy、len、cap等等。