在做力扣的过程中,写了读取数组的函数,发现了一个问题,当我在函数中改变切片的值,这个切片的值没有传递到函数外。函数如下
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函数再添加第四个元素时,他会隐式的创建一个长度更长的切片来容纳新的数据,而这个切片跟原来的切片就不是同一个了,所以这个返回的值就没有办法被传递
因为旧的切片并没有改变。

486

被折叠的 条评论
为什么被折叠?



