golang函数传参详解

本文详细介绍了Go语言中的函数传参,包括值类型和引用类型的区别。值类型在传递时会复制一份,而引用类型传递的是地址,直接修改形参会影响实参。Go语言不支持真正的引用传递,但闭包可以实现类似效果。对于值类型,若想改变实参,需要传递指针。在性能考虑下,通常建议大的对象使用指针传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang的基本类型分类

***golang中的基本类型分为值类型和引用类型***参考Go中的值类型和引用类型

函数传参的两种方式

1.值传递
2.引用传递

注:

  1. golang函数传参都是以复制变量的方式,不支持引用的方式
  2. 特殊的是:go语言闭包函数对外部变量是以引用的方式使用 参考由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨

摘自go语言高级编程里的一段话:
在这里插入图片描述

golang传递基本类型的不同

  1. golang传递值类型是指复制了一份值之后传递,改变形参并不能改变原有实参的值
package main

import (
	"fmt"
)

func main() {
	a := 888
	changeint(a)
	fmt.Println(a) //888
}
func changeint(int1 int) {
	int1 = 999
}

  1. golang传递引用类型是传递地址,改变形参会改变原有实参的值
package main

import (
	"fmt"
)

func main() {
	a := make(map[int]int)
	a[1] = 888
	fmt.Println(a) //map[1:888]
	changemap(a)
	fmt.Println(a) //map[1:999]
}

func changemap(map1 map[int]int) {
	map1[1] = 999
}
  1. golang引用类型传递之后整体赋值,并不能改变原有实参的值
package main

import (
	"fmt"
)

func main() {
	a := make(map[int]int)
	a[1] = 888
	fmt.Println(a) //map[1:888]
	changemap(a)
	fmt.Println(a) //map[1:888]
}

func changemap(map1 map[int]int) {
	map2 := make(map[int]int)
	map2[1] = 999
	map1 = map2
}

注:引用进行第二次赋值的时候,实际上把这份引用指向了另外一个变量,所以之后对这个变量的操作不会影响到外部的对象。

  1. golang任何类型的全局变量都能被形参改变
package main

import (
	"fmt"
)

var map1 = make(map[int]int)

func main() {
	map1[1] = 888
	map2 := make(map[int]int)
	map2[1] = 999
	changemap(map2)
	fmt.Println(map1) //map[1:999]
}

func changemap(map2 map[int]int) {

	map1 = map2
}
  1. golang传递值类型想要改变实参,需要传递值类型的指针
package main

import (
	"fmt"
)

func main() {
	a := 888
	changeint(&a)
	fmt.Println(a) //999

}
func changeint(int1 *int) {
	*int1 = 999

6.golang传递值类型时通常传递指针(在对象较大时能够提升性能,减少内存使用),同时传递类型要做到统一

又吵起来了,Go 是传值还是传引用?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值