package main
import "fmt"
func main() {
var s1 = []int{1, 2, 3, 4, 5}
var s2 = s1[:]
fmt.Printf("s1的地址为%p\n", &s1)
fmt.Printf("s2的地址为%p\n", &s2)
s2 = append(s2, 6)
fmt.Printf("字面量的地址为%p\n", s1)
fmt.Printf("字面量的地址为%p\n", s2)
s2[2] += 100
fmt.Println(s1)
fmt.Println(s2)
}
//当使用s1为s2赋值时,二者本身的存储地址位于一个区但是不同,而指向
//同一个字面量,当使用s2改变字面量的一部分时,用s1访问,发现也被改变了
//此时s1的len=5,cap=5,当使用append在s2后面追加一个6,
//编译器不会在以前那个字面量后面增加一个6,而是会重新开辟一个普通数组,赋值之前的数组,
//并增加一个6
go的切片类型,底层是普通数组,而一个切片类型数据包括一个指针,指向字面量,字面量则是切片所包含的内容,还包括len,和cap。当使用同一个切片(图中为s1)为另一个切片赋值时(完全复制或子切片),二者会指向同一个字面量,验证如下
package main
import "fmt"
func main() {
var s1 = []int{1, 2, 3, 4, 5}
var s2 = s1[0:3]
fmt.Printf("s1的地址为%p\n", &s1)
fmt.Printf("s2的地址为%p\n", &s2)
fmt.Printf("字面量的地址为%p\n", s1)
fmt.Printf("字面量的地址为%p\n", s2)
fmt.Println(s1)
fmt.Println(s2)
}