You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言切片元素转移失败:为何无法移动元素并清空原切片

Go切片转移元素未生效的原因及修复方案

问题根源

你在transfer函数里犯了一个典型的Go语言指针使用错误:修改的是指针参数的副本,而非原指针指向的切片结构体。

Go语言中所有参数都是值传递,包括指针类型。当你把&arr0和&arr1传入transfer时,函数内部的arr0、arr1只是这两个指针的副本。你执行arr1 = &tmp和arr0 = &s,仅仅改变了副本的指向,完全没触及main函数里原指针指向的切片结构体,所以外部的arr0和arr1自然不会有任何变化。

修正后的代码

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 = append(*arr1, (*arr0)...)
    // 通过切片截取清空arr0指向的原切片
    *arr0 = (*arr0)[:0]
}

关键修正点说明

  1. 直接操作原切片:通过*arr1和*arr0解引用指针,直接访问main函数里的原切片结构体,修改它的内容和长度。
  2. 高效转移元素:用(*arr0)...展开切片元素,一次性追加到*arr1,比循环逐个append更简洁高效。
  3. 安全清空切片:(*arr0)[:0]通过截取操作将切片长度置为0,既清空了元素,又保留了原切片的底层数组容量(如果后续需要复用的话),也可以用*arr0 = nil直接将切片置为空,彻底释放底层数组引用。

内容的提问来源于stack exchange,提问作者syoui jyo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:15:11