gpt4 book ai didi

go - 将结构属性( slice )传递给从中删除元素的函数时的奇怪行为

转载 作者:IT王子 更新时间:2023-10-29 01:49:39 24 4
gpt4 key购买 nike

这些天我开始学习 Go,并一直试图将结构属性的值( slice )传递给函数。显然它是作为引用传递的(或者它持有指向其 slice 的指针)并且函数内部所做的更改会影响它。

这是我的代码,其中 testFunction 应该接收一个 slice ,删除它的前 3 个元素并打印更新后的值,但不会在外部影响它:

package main

import (
"fmt"
)

type testStruct struct {
testArray []float64
}

var test = testStruct {
testArray: []float64{10,20,30,40,50},
}

func main() {
fmt.Println(test.testArray)
testFunction(test.testArray)
fmt.Println(test.testArray)
}

func testFunction(array []float64) {
for i:=0; i<3; i++ {
array = removeFrom(array, 0)
}
fmt.Println(array)
}

func removeFrom(array []float64, index int) []float64 {
return append(array[:index], array[index+1:]...)
}

输出:

[10 20 30 40 50]
[40 50]
[40 50 50 50 50]

我的问题是:是什么导致第三个 fmt.Println 打印这个奇怪的结果?

Playground :https://play.golang.org/p/G8W3H085In

p.s.: 这段代码只是一个例子。删除某些东西的第一个元素不是我的目标。我只想知道是什么导致了这种奇怪的行为。

最佳答案

通常我们不知道给定的 append 调用是否会导致重新分配,因此我们不能假设原始 slice 与结果 slice 引用相同的数组,也不能假定它引用不同的数组。

要正确使用 slice ,请务必记住,虽然底层数组的元素是间接的,但 slice 的指针、长度和容量不是。

因此,通常将 append 调用的结果分配给同一个 slice 变量:

array = append(array, ...)

总而言之,要获得期望的结果,请始终记住将追加函数分配给新的或相同的 slice 变量。

这是更正后的工作代码:

package main

import (
"fmt"
)

type testStruct struct {
testArray []float64
}

var test = testStruct {
testArray: []float64{10,20,30,40,50},
}

func main() {
fmt.Println(test.testArray)
a := testFunction(test.testArray)
fmt.Println(a)
}

func testFunction(array []float64)[]float64 {
for i:=0; i<3; i++ {
array = removeFrom(array, 0)
}
fmt.Println(array)
return array
}

func removeFrom(array []float64, index int) []float64 {
return append(array[:index], array[index+1:]...)
}

检查 上的工作代码 Go Playground .


另一种解决方案是通过指针引用传递数组参数:

func testFunction(array *[]float64) {
for i:=0; i<3; i++ {
*array = removeFrom(*array, 0)
}
fmt.Println(*array)
}

Go Playground

关于go - 将结构属性( slice )传递给从中删除元素的函数时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com