Go 中切片是引用类型但本身按值传递若要在方法内修改原始切片必须使用指针接收者并直接赋值给解引用后的接收者test append(test, x)而非重新赋值指针变量。 go 中切片是引用类型但本身按值传递若要在方法内修改原始切片必须使用指针接收者并直接赋值给解引用后的接收者*test append(*test, x)而非重新赋值指针变量。在 Go 语言中切片slice底层由指向底层数组的指针、长度len和容量cap三部分构成。虽然切片“引用”底层数组但切片头slice header本身是值类型——当以值接收者调用方法时传入的是该切片头的副本对副本的 append 操作只会修改副本原切片不受影响。? 常见错误值接收者无法修改原始切片type Test []stringfunc (test Test) Add(str string) { test append(test, str) // 修改的是 test 的副本main 中的 test 不变}func main() { t : Test{} t.Add(value) fmt.Println(len(t)) // 输出0 —— 未生效}此处 test 是 Test 类型的副本append 后重新赋值给该副本对原始变量无任何影响。? 错误进阶指针接收者但误改指针地址func (test *Test) Add(str string) { v : append(*test, str) test v // 错误test 是指针变量v 创建新地址并赋给局部指针变量}test v 只改变了方法内 test 指针变量所指向的地址而调用方传入的指针如 t并未被更新因此原始切片仍保持不变。? 正确做法通过解引用赋值更新底层数组与头信息要真正扩展原始切片需将 append 的结果写回指针所指向的原始内存位置 JoinMC智能客服 JoinMC智能客服帮您熬夜加班7X24小时全天候智能回复用户消息自动维护媒体主页全平台渠道集成管理电商物流平台一键绑定让您出海轻松无忧