package main
import "fmt"
func main() {
//打印地址问题
nums1 := []int{1, 2, 3, 4, 5}
fmt.Println("打印nums1的地址:")
println(nums1)
println(&nums1[0])
fmt.Printf("%p \n", nums1)
fmt.Printf("%p\n", &nums1[0])
fmt.Println("=================================")
//slice截取问题
nums2 := nums1[0:3]
fmt.Println("nums2的容量还未扩容前,nums1和nums2是共用同一个数组")
fmt.Printf("nums1 :%v,len:%d,cap:%d,地址:%p\n", nums1, len(nums1), cap(nums1), &nums1[0])
fmt.Printf("nums2 :%v,len:%d,cap:%d,地址:%p\n", nums2, len(nums2), cap(nums2), &nums2[0])
fmt.Println("nums2的容量还未扩容前,修改nums2会影响nums1")
nums2[0] = 7
fmt.Printf("nums1 :%v,len:%d,cap:%d,地址:%p\n", nums1, len(nums1), cap(nums1), &nums1[0])
fmt.Printf("nums2 :%v,len:%d,cap:%d,地址:%p\n", nums2, len(nums2), cap(nums2), &nums2[0])
nums2 = append(nums2, 8, 9, 10)
fmt.Println("nums2的容量扩容后,nums1和nums2是不同地址")
fmt.Printf("nums1 :%v,len:%d,cap:%d,地址:%p\n", nums1, len(nums1), cap(nums1), &nums1[0])
fmt.Printf("nums2 :%v,len:%d,cap:%d,地址:%p\n", nums2, len(nums2), cap(nums2), &nums2[0])
fmt.Println("nums2的容量扩容后,修改nums2不影响nums1")
nums2[0] = 999
fmt.Printf("nums1 :%v,len:%d,cap:%d,地址:%p\n", nums1, len(nums1), cap(nums1), &nums1[0])
fmt.Printf("nums2 :%v,len:%d,cap:%d,地址:%p\n", nums2, len(nums2), cap(nums2), &nums2[0])
}
输出结果如下
打印nums1的地址:
[5/5]0xc00000e360
0xc00000e360
0xc00000e360
0xc00000e360
=================================
nums2的容量还未扩容前,nums1和nums2是共用同一个数组
nums1 :[1 2 3 4 5],len:5,cap:5,地址:0xc00000e360
nums2 :[1 2 3],len:3,cap:5,地址:0xc00000e360
nums2的容量还未扩容前,修改nums2会影响nums1
nums1 :[7 2 3 4 5],len:5,cap:5,地址:0xc00000e360
nums2 :[7 2 3],len:3,cap:5,地址:0xc00000e360
nums2的容量扩容后,nums1和nums2是不同地址
nums1 :[7 2 3 4 5],len:5,cap:5,地址:0xc00000e360
nums2 :[7 2 3 8 9 10],len:6,cap:10,地址:0xc0000182d0
nums2的容量扩容后,修改nums2不影响nums1
nums1 :[7 2 3 4 5],len:5,cap:5,地址:0xc00000e360
nums2 :[999 2 3 8 9 10],len:6,cap:10,地址:0xc0000182d0
问题思考:
1、fmt.Println()和println()的区别
2、fmt.Println()和println()如何打印数组或slice地址
3、slice截取时新老slice是共用同一数组,执行append操作使得新的slice或老的slice底层数组扩容,移动到新的位置,两者就不会相互影响。截取时新slice的cap是怎么变化的