如何在 Go 方法中正确修改切片类型

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小时全天候智能回复用户消息,自动维护媒体主页,全平台渠道集成管理,电商物流平台一键绑定,让您出海轻松无忧!

相关推荐
Volunteer Technology4 分钟前
Flink Sink
大数据·数据库·flink
程思扬4 分钟前
Android Room 数据库跨版本升级闪退问题根治方案
android·数据库·oracle
小江的记录本8 分钟前
【JVM虚拟机】类加载机制:类加载器、双亲委派模型、好处、破坏双亲委派的场景(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
IvorySQL8 分钟前
PostgreSQL 技术日报 (5月31日)|内核功能研讨,PG 大会赛事动态
数据库·postgresql
小陶来咯15 分钟前
FunctionCall实现与Prompt调优
python·ai·prompt
Devin~Y28 分钟前
智慧物流+AIGC客服Java大厂面试:Spring Boot、Kafka、Redis、JVM与RAG Agent实战
java·jvm·spring boot·redis·spring cloud·kafka·rag
todoitbo28 分钟前
一台 2C2G 服务器上的 KingbaseES 安装记录
运维·服务器·数据库·国产数据库
mN9B2uk1731 分钟前
SQL Server 数据库设计
数据库·oracle
AI 编程助手GPT31 分钟前
ChatGPT 新手入门与实战操作指南
开发语言·人工智能·git·python·chatgpt
Elastic 中国社区官方博客34 分钟前
使用 Jina CLIP v2 和 Elasticsearch 实现多语言图片搜索
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·jina