首先,数组是固定长度的,一旦创建后,长度无法改变。切片则是动态长度的,可以根据需要进行扩容或缩容。
其次,数组在传参时,是按值传递,也就是说传递的是数组的副本,而不是原始数组。而切片在传参时,是按引用传递,也就是说传递的是指向底层数组的指针。这意味着,当对切片进行修改时,会直接影响到原始切片所指向的底层数组。
下面是一个示例代码,演示数组和切片在传参时的不同:
package main
import "fmt"
func modifyArray(arr [3]int) {
arr[0] = 99
}
func modifySlice(s []int) {
s[0] = 99
}
func main() {
a := [3]int{1, 2, 3}
modifyArray(a)
fmt.Println(a) //输出:[1 2 3]
s := []int{1, 2, 3}
modifySlice(s)
fmt.Println(s) //输出:[99 2 3]
}
modifyArray()modifySlice()modifyArray()modifySlice()
另一种向切片中追加元素的方法
append()copy()copy()
func copy(dst, src []Type) int
copy()copy()
package main
import "fmt"
func main() {
s1 := []int{1, 2, 3}
s2 := make([]int, len(s1)+1)
copy(s2, s1)
s2[len(s2)-1] = 4
fmt.Println(s1) //输出:[1 2 3]
fmt.Println(s2) //输出:[1 2 3 4]
}
s1make()s1s2copy()s1s2s1s2
结论
append()copy()append()copy()
最后,我希望本文可以帮助到正在学习Golang的开发者们,对切片的使用有更加深入的了解。