当前位置: 首页 > news >正文

go的参数传递都是值传递,但切片需要注意

根据之前学习python和java的经验,每次学习一门新语言时,一定要搞清楚方法的参数传递是值传递,引用传递还是指针传递。
主要原因就是需要知道,某种类型的数据传递给某个方法后,方法里面对它的修改是否会影响到这个数据本身。

结论

在 Go 语言中,所有方法的参数传递都是值传递(Pass by Value)。这意味着无论是基本类型(如 int、string)、结构体,还是引用类型(如切片、映射、通道、指针等),传递给方法的始终是参数的副本。不过,对于引用类型或指针来说,虽然传递的是副本,但这些副本中保存的是指向底层数据结构的指针,因此可能表现出类似“引用传递”的行为。

基础数据类型

像字符串类型,数值类型就不用多说,传递到方法中的是拷贝。

struct

传递到方法中的是拷贝。

slice

切片本质上也是一个结构体。在runtime/slice.go中有如下定义

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

这也就解释了如下情况。

func main() {
	var s1, s2 = []int{1, 2, 3}, []int{1, 2, 3}
	modify1(s1)
	fmt.Println(s1) // [588,2,3]

	modify2(s2)
	fmt.Println(s2) // [1,2,3]
}

func modify1(a []int) {
	a[0] = 588 // 可以修改原来切片s的第一个值为588,即s={588,2,3},因为是通过指针修改的unsafe.Pointer
}

func modify2(a []int) {
	a = a[:2] // 此时无法修改成功使s={2,3},因为a是s副本
}

常见误区

  1. “切片是引用传递”
    切片传递的是描述符的副本(包含指向底层数组的指针),因此对底层数组的修改会影响原切片。但如果是修改切片的长度或容量(如 append),则不会影响原切片,除非显式返回并覆盖。

  2. “映射和通道是引用类型”
    映射和通道的行为类似指针,但严格来说它们仍然是值传递。它们的底层数据结构在堆上分配,传递的是指向堆内存的指针的副本。

  3. 切片的指针传递*mySlice = otherSlice操作

func main() {

	mySlice := []int{1, 2, 3}
	modify1(&mySlice)
	fmt.Println(mySlice) // [1,2,3]

	modify2(&mySlice)
	fmt.Println(mySlice) // [87,34,99]

}

func modify1(mySlice *[]int) {
	otherSlice := []int{87, 34, 999}
	mySlice = &otherSlice // 将mySlice指针指向otherSlice的地址
}

func modify2(mySlice *[]int) {
	otherSlice := []int{87, 34, 999}
	*mySlice = otherSlice // 修改mySlice指针指向的地址的切片数据为otherSlice
}

在这里插入图片描述

相关文章:

  • C++ 性能优化隐藏危机:忽视数据结构与内存细节,效率大打折扣
  • 【前端】在<el-form>里循环插入list内容
  • 百度富文本编辑器配置(vue3)
  • Ubuntu20.04 Qt5安装和卸载
  • uniapp处理流式请求
  • 【计算机网络】-计算机网络期末复习题复习资料
  • WebRTC协议全面教程:原理、应用与优化指南
  • 专访海鹏科技董事长秘书、服务总监赵静波:前瞻式智能化管理,为全球售后服务保驾护航
  • STM32基本GPIO控制
  • 【linux】ubuntu 用户管理
  • 5G NR PRACH 随机接入前导序列
  • CTF-Pixel系列题目分析
  • 前端表格数据导出Excel文件方法,列自适应宽度、增加合计、自定义文件名称
  • 初探 Dubbo Rust SDK打造现代微服务的新可能
  • vulhub/Web Machine(N7)靶机----练习攻略
  • Linux固定IP方法(RedHat+Net模式)
  • 【Linux系统】计算机世界的基石:冯诺依曼架构与操作系统设计
  • 【HCIA-网工探长】04:ARP笔记
  • 20242817李臻《Linux⾼级编程实践》第6周
  • Vue项目与云管平台Nginx部署笔记
  • 兴业证券:下半年A股指数稳、结构牛,中国资产重估刚刚开始
  • 韩国总统选举白热化进行中,中韩青年民间交流促两国友好往来
  • 两名游客刻划八达岭长城,被拘5日罚200元
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 南宁海关辟谣网传“查获600公斤稀土材料”:实为焊锡膏
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力