Golang的数据声明格式如下
data := [7]int{}
data:=[3]int{1, 2, 3}
data := [...]int{1, 2, 3}
我们注意到,与其他语言不同的是数组的大小放在前面。
Go 语言的数组当做参数时,是值传递,即会copy数组中的所有数据。
所以在实际的go语言开发中其实很少使用数组,而是使用slice.
所以下面我们重点介绍一下slice
data := []int{}
data := []int{1,2, 3}
slice的声明和array类似,只是省略了大小或者'...'
当slice的空间不足时,它就会自动将存储空间增加一倍。
可以用len(data)获取slice中数据的长度,用cap(data)获取slice的容量(capacity).
func printSlice(data []int){
for _, ele := range data{
fmt.Print(ele, " ")
}
fmt.Println()
}
func main(){
data := []int{1,2,3,4}
printSlice(data)
fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))
data = append(data, 10)
printSlice(data)
fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))
}
------------------------------------------
//result
1 2 3 4
Capacity: 4, Length: 4
1 2 3 4 10
Capacity: 8, Length: 5
上述代码生声明一个slice, 初始容量和数据长度都是4,然后通过append在slice后面动态添加了一个数据10, 此时由于容量已经等于已有数据长度,即slice已满,所以需要动态扩容,go扩容方案是直接在原来的基础上加倍, 所以我们看到长度增加了1,但是容量增加了4
所以这里需要注意的就是,如果slice容量已经很多,且满了。那么此时添加一条记录的代价将是非常高的。
我们也可以通过make函数来生成slice. 通过make函数还可以指定slice的初始大小
data := make([]byte, 5)
*说到make,这里我们提一下go语言的内存分配, go 有两个内建函数来分配内存,new 和make. 两者的区别是,new只是分配存储空间,make则主要用于slice, map, channel的初始化
copy() 函数
copy(dst, src): copy函数将src slice的数据拷贝到dst slice里面
其中,
- dst, src必须是slice, 如果是array,则必须通过array[0:] 转换成slice
- copy时,src数据会覆盖dst里面原来的数据, 如果src数据量小于dst数据量,那么dst里面会有一部分数据不被覆盖;如果src数据量大于dst,那么将只copy dst.length长度的src数据
我们通过下面的实例来体会一下
package main
import "fmt"
func main(){
a6 := []int{1,2,3,4,5,6}
a4 := []int{-1,-2,-3,-4}
fmt.Println("a6:", a6)
fmt.Println("a4:", a4)
copy(a6, a4)
fmt.Println("copy a4 to a6, ", a6)
fmt.Println()
a6 = []int{1,2,3,4,5,6}
a4 = []int{-1,-2,-3,-4}
copy(a4, a6)
fmt.Println("copy a6 to a4, ", a4)
fmt.Println()
array5 := [5]int{5,-5,5,-5,5}
s7 := []int{7,7,7,7,7,7,7}
fmt.Println("array5 ", array5)
fmt.Println("s7 ", s7)
copy(array5[0:], s7)
fmt.Println("copy s7 to array5 ", array5)
}
--------------------------------------------
//result
a4: [-1 -2 -3 -4]
copy a4 to a6, [-1 -2 -3 -4 5 6]
copy a6 to a4, [1 2 3 4]
array5 [5 -5 5 -5 5]
s7 [7 7 7 7 7 7 7]
copy s7 to array5 [7 7 7 7 7]
有疑问加站长微信联系(非本文作者)