go打印地址和slice截取一些问题思考

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是怎么变化的

你可能感兴趣的:(Go,golang)