首先,数组是固定长度的,一旦创建后,长度无法改变。切片则是动态长度的,可以根据需要进行扩容或缩容。

其次,数组在传参时,是按值传递,也就是说传递的是数组的副本,而不是原始数组。而切片在传参时,是按引用传递,也就是说传递的是指向底层数组的指针。这意味着,当对切片进行修改时,会直接影响到原始切片所指向的底层数组。

下面是一个示例代码,演示数组和切片在传参时的不同:

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的开发者们,对切片的使用有更加深入的了解。