[每日code002]考察基础

原创 ryan007  2019-08-01 00:35  阅读 136 次

请说出如下代码输出结果,并分析为什么?

package main

import "fmt"

func foo(arg []int) {
	arg = append(arg, 11, 12, 13)
	fmt.Println("foo:", arg)
}



func main() {
	arr := [5]int{1, 2, 3}
	arg1 := arr[:] 
	arg2 := arg1[:3]

	fmt.Println(arg1, len(arg1), cap(arg1))
	fmt.Println(arg2, len(arg2), cap(arg2))
	foo(arg1)
	foo(arg2)
	fmt.Println(arg1)
	fmt.Println(arg2)
}

考察重点切片底层,容量如何扩容:

[1 2 3 0 0] 5 5
[1 2 3] 3 5
foo: [1 2 3 0 0 11 12 13]
foo: [1 2 3 11 12 13]
[1 2 3 0 0]
[1 2 3]

 

当函数的参数是切片的时候,到底是传值还是传引用?从foo函数中打出的参数s的地址,可以看出肯定不是传引用,毕竟引用都是一个地址才对。然而foo函数内改变了s的值,也改变了原始变量slice的值,这个看起来像引用的现象,实际上正是我们前面讨论的切片共享底层数组的实现。

即切片传递的时候,传的是数组的值,等效于从原始切片中再切了一次。原始切片slice和参数s切片的底层数组是一样的。因此修改函数内的切片,也就修改了数组。

本文地址:http://it.zhongduwang.com/articles/%e6%af%8f%e6%97%a5code002%e8%80%83%e5%af%9f%e5%9f%ba%e7%a1%80
版权声明:本文为原创文章,版权归 ryan007 所有,欢迎分享本文,转载请保留出处!

发表评论


表情