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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值