【go】关于切片的值没有传递到函数外的问题

在做力扣的过程中,写了读取数组的函数,发现了一个问题,当我在函数中改变切片的值,这个切片的值没有传递到函数外。函数如下

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)


func createarray(nums []int){
	for {
		inputReader := bufio.NewReader(os.Stdin)
		strBytes, _, err := inputReader.ReadLine()

		str := strings.Fields(string(strBytes))

		for i := range str {
			n, _ := strconv.Atoi(str[i])
			nums = append(nums, n)			
		}

		if err == nil {
			break
		}
	}
						
}

这个函数读取了输入中的一串数字,将其转化为数组传入nums中

func main() {

	var nums []int

	fmt.Println("请输入数组:")

	createarray(nums)

	fmt.Println(nums)

}

在main中运行,打印出来的结果是

经过测试后,发现是在函数中nums的值改变了,但是他并没有传递到函数外

但是切片是可以将值传递到函数外的。验证如下

我创建了一个slicecreate函数,用来改变slice的值

package main

func slicechange(nums []int) {
	nums[1] = 3
}

main函数如下

func main {
	nums := make([]int, 3)
	for i := 0; i < 3; i++ {
		nums[i] = 5
	}
	fmt.Println(nums)

	slicechange(nums)
	fmt.Println(nums)
}

我创建了一个[5,5,5]的切片,并用slicechange改变了nums[1]的值,也就是第二个数字

结果证明slice的值是可以传递到函数外面的

但是第一个例子为何无法传递?

这时候就需要提到第一个例子中的append函数,append函数用于给slice添加新的元素,当slice长度不够时,会实现自动扩容

而这个自动扩容的实质上,其实是创建了一个新的切片来容纳,例如我创建了一个长度为3的切片,并且赋值,当我使用append函数再添加第四个元素时,他会隐式的创建一个长度更长的切片来容纳新的数据,而这个切片跟原来的切片就不是同一个了,所以这个返回的值就没有办法被传递

因为旧的切片并没有改变。

参考文章:https://juejin.cn/post/6888117219213967368

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值