🚀 Go切片传参到底是值传递还是引用传递?

前言

在Go语言中,值类型和引用类型:

  • 「值类型」:基本数据类型,int, float, bool, 数组, struct。 特点:变量直接存储值。
  • 「引用类型」:指针,slice, map, chan, interface, 指针。 特点:变量存储的是一个地址,这个地址存储最终的值。

面试官 👨:切片作为函数参数是值传递还是引用传递?

我:那肯定是引用传递啊,因为在函数内部改变会影响实际参数。

面试官 👨:好吧,回去等通知吧。

我:❓❓❓


📔所以切片作为函数参数到底是传值还是传引用呢?我们接下来一探究竟。

什么是值传递,什么是引用传递?

值传递

是指在调用函数时,将实际参数拷贝一份传递到函数中,这样在函数中对参数进行修改不会影响到实际参数。

引用传递

是指在调用函数时,将实际参数的地址传递到函数中,在函数中对参数所进行的修改,将影响实际参数

go 复制代码
package main

import "fmt"

func main() {
	data := []int{1, 2, 3, 4}
	fmt.Println(fmt.Sprintf("原始的地址:%p", &data))
	fmt.Println("原始的值:", data)
	f1(data)
	fmt.Println("调用函数过后的值:", data)
}

func f1(data []int) {
	fmt.Println(fmt.Sprintf("f1内部的地址:%p", &data))
	data[0] = 100
}
txt 复制代码
原始的地址:0xc000090210
原始的值: [1 2 3 4]
f1内部的地址:0xc000090240
调用函数过后的值: [100 2 3 4]

进程 已完成,退出代码为 0

💡 从代码中可以看到确实函数内部能影响实际参数的值,符合引用传递的特性。但是❗❗❗❗发现函数内部的地址和实际参数的地址不一样,这是为啥呢❓❓❓❓

这是因为slice 是引用类型, 实际存储的是指向底层数组的指针,所以函数内部改变数据会影响实际参数。

go 复制代码
type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

🎯 总结

  • Go里其实没有真正的引用传递,所有的传递都是值传递,只不过有些参数类型的值实际存储的是指针,所以修改会影响底层数据。
  • 应用类型 不等于 应用传递,这是两个概念。

互动话题:你在使用切片时踩过最深的坑是什么?是并发问题、扩容陷阱,还是和接口转换的奇葩错误?评论区分享你的血泪史! 💬

相关推荐
孔令飞20 小时前
工具分享:OneX AI 工具安装、配置及功能介绍
云原生·go·ai编程
喵了几个咪1 天前
GoWind Admin 拆解:一个 Sender 接口接 39 个通知渠道
微服务·golang·go·1024程序员节·admin·gowind
l1t1 天前
在windows中测试musql数据库
数据库·sqlite·go·1024程序员节
用户360055579001 天前
Kestrel_VLLM - 19 · KV 复用迁移到 GPU(上):per-state 镜像与同类静默分叉
go
我的div丢了肿么办2 天前
go语言对路由中的业务逻辑进行抽离
后端·go
孔令飞2 天前
1024程序员节,OneX平台送3套免费Go实战项目
云原生·go·ai编程
我不会起名字3222 天前
gRPC 拦截器写错:metadata 透传与超时注入的 3 个坑
微服务·go·grpc·拦截器
用户4015823324623 天前
对话一长,AI 就忘了你说过的话?Claude Code、Codex、Aider、WES Code 怎么压缩上下文
人工智能·go·ai编程
我的div丢了肿么办3 天前
go语言抽离路由文件以及对路由进行分组
后端·go
孔令飞3 天前
【OneX】OneX AI 工具安装、配置及功能介绍
云原生·go·ai编程