英文:
How to move elements from one slice to another
问题
package main
import (
"fmt"
)
func main() {
arr0 := []int{
1,2,3,4,5,
}
arr1 := []int{}
fmt.Println(arr0)
fmt.Println(arr1)
fmt.Println("转移中...")
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
}
对于transfer函数,我打算将切片arr0的元素转移到切片arr1中,并清空切片arr0
但是这个操作没有成功
这是我的输出结果
[1 2 3 4 5]
[]
转移中...
[1 2 3 4 5]
[]
转移后,我需要以下结果。
[]
[1 2 3 4 5]
但实际上,main函数中的arr0和arr1保持不变!
有人能告诉我为什么不行吗?
我以为在内存中应该是这样的
[![enter image description here][1]][1]
运行transfer函数后
[![enter image description here][2]][2]
<details>
<summary>英文:</summary>
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
}
For function of transfer, I intented to transfer elements of slice arr0 to slice arr1 and empty slice arr0
But it is not successful
Here is my output
[1 2 3 4 5]
[]
transferring...
[1 2 3 4 5]
[]
After transferring, I need the result below.
[]
[1 2 3 4 5]
But actually, arr0, and arr1 in the main function remain as it was!
can someone tell me why this is not ok?
I thought in the memory, it should be like this
[![enter image description here][1]][1]
after running transfer function
[![enter image description here][2]][2]
[1]: https://i.stack.imgur.com/WUBOZ.png
[2]: https://i.stack.imgur.com/e2TZa.png
</details>
# 答案1
**得分**: 3
@jacobsa给出了一个很好的答案。
记住这一点。你可以以更好的性能实现相同的效果。Golang为此提供了一个很好的机会。
```go
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
}
英文:
@jacobsa has given an excellent answer.
Just keep that in mind. You can achieve the same effect but with better performance. Golang offers an excellent opportunity for this.
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
}
答案2
得分: 2
这两行代码:
arr1 = &tmp
arr0 = &s
在函数内部改变了局部变量arr1
和arr0
。这些变量恰好是指针,但它们只是main
函数提供的输入指针的副本,它们不是指向输入指针的引用。
如果你改变了arr1
和arr0
指针所指向的内容,而不是指针本身,那么你会看到main
函数提供的值发生变化:
*arr1 = tmp
*arr0 = s
英文:
These two lines:
arr1 = &tmp
arr0 = &s
change the local variables arr1
and arr0
within the function. Those variables happen to be pointers, but they are just copies of the input pointers provided by main
—they are not references to the input pointers.
If you changed the things the arr1
and arr0
pointers point to, rather than the pointers themselves, then you would see a change to the values provided by main
:
*arr1 = tmp
*arr0 = s
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论