package main
import "fmt"
func main() {
// 在go语言中,切片是对底层数组的引用。所以当我们从一个切片切出另一个切片时,两个切片是共享底层数组的
s1 := []int{1, 2, 3, 4}
s2 := s1[2:]
fmt.Printf("s1: %v, len %d,cap: %d \n", s1, len(s1), cap(s1))
fmt.Printf("s2: %v, len %d, cap: %d \n", s2, len(s2), cap(s2))
//s1: [1 2 3 4], len 4,cap: 4
//s2: [3 4], len 2, cap: 2
// 修改s2的值,s1的值也会变化
s2[0] = 99
fmt.Printf("s1: %v, len %d, cap: %d \n", s1, len(s1), cap(s1))
fmt.Printf("s2: %v, len %d, cap: %d \n", s2, len(s2), cap(s2))
//s1: [1 2 99 4], len 4, cap: 4
//s2: [99 4], len 2, cap: 2
//但是如果对切片使用append()函数追加新元素,切片就会指向一个新的底层数组,此时s1和s2就不是共享同一个数组了
s2 = append(s2, 199)
fmt.Printf("s1: %v, len %d, cap: %d \n", s1, len(s1), cap(s1))
fmt.Printf("s2: %v, len %d, cap: %d \n", s2, len(s2), cap(s2))
//s1: [1 2 99 4], len 4, cap: 4
//s2: [99 4 199], len 3, cap: 4
s2[1] = 1999
fmt.Printf("s1: %v, len %d, cap: %d \n", s1, len(s1), cap(s1))
fmt.Printf("s2: %v, len %d, cap: %d \n", s2, len(s2), cap(s2))
//s1: [1 2 99 4], len 4, cap: 4
//s2: [99 1999 199], len 3, cap: 4
}
go的切片共享问题
于 2023-05-12 15:26:56 首次发布