如何将元素从一个切片移动到另一个切片

How to move elements from one slice to another

提问人:syoui jyo 提问时间:12/28/2022 最后编辑:ainsyoui jyo 更新时间:12/28/2022 访问量:113

问:

package main

import (
    "fmt"
)

func main() {
    arr0 := []int{
        1,2,3,4,5,
    }
    arr1 := []int{}

    fmt.Println(arr0)
    fmt.Println(arr1)
    fmt.Println("transferring...")
    transfer(&arr0, &arr1)
    fmt.Println(arr0)
    fmt.Println(arr1)
}

func transfer(arr0 *[]int, arr1 *[]int) {
    tmp := make([]int, 0)
    for i:=0;i<len(*arr0);i++ {
        tmp = append(tmp, (*arr0)[i])
    }

    arr1 = &tmp
    s := make([]int, 0)
    arr0 = &s
}

对于传输功能,我打算将切片 arr0 的元素传输到切片 arr1 和空切片 arr0

但它没有成功

这是我的输出

[1 2 3 4 5]
[]
transferring...
[1 2 3 4 5]
[]

转移后,我需要以下结果。 [] [1 2 3 4 5] 但实际上,main 函数中的 arr0 和 arr1 保持原样!

有人可以告诉我为什么这不行吗?

我在记忆里想,应该是这样的

enter image description here

运行传递函数后

enter image description here

Go 指针 切片

评论


答:

2赞 jacobsa 12/28/2022 #1

这两行:

arr1 = &tmp
arr0 = &s

更改局部变量和函数内部。这些变量恰好是指针,但它们只是 提供的输入指针的副本,它们不是对输入指针的引用arr1arr0main

如果更改了 和 指针指向的内容,而不是指针本身,则会看到对 以下项提供的值的更改:arr1arr0main

*arr1 = tmp
*arr0 = s
3赞 slaff.bg 12/28/2022 #2

@jacobsa给出了一个很好的答案。

请记住这一点。您可以达到相同的效果,但性能更好。Golang 为此提供了绝佳的机会。

package main

import (
    "fmt"
)

func main() {
    arr0 := []int{
        1, 2, 3, 4, 5,
    }
    arr1 := []int{}

    fmt.Println(arr0)
    fmt.Println(arr1)
    fmt.Println("transferring...")
    transfer(&arr0, &arr1)
    fmt.Println(arr0)
    fmt.Println(arr1)
}

func transfer(arr0 *[]int, arr1 *[]int) {
    *arr0, *arr1 = *arr1, *arr0
}

评论

1赞 syoui jyo 12/28/2022
实际上我想这样做 [1,2,3,4,5], [] 到 [], [5,4,3,2,1] 而,没关系