golang 传值还是传引用

传值:数组

传引用:切片

举例:

func test(){
	a:=[]int{1,2,2}
	b:=[...]int{1,2,2}
	func(a []int) {
		a[0]=3
	}(a)
	func(b [3]int){
		b[0]=4
	}(b)
	fmt.Println(a)
	fmt.Println(b)
}

执行结果是:

[3 2 2]
[1 2 2]

原因分析:

数组在go里边是值传递的,在作为参数的时候是会整个复制的

slice传递的是一个包含长度和指针的结构体

举例:

type Counter struct {
	Count int
}
func (c Counter)Add()  {
	c.Count++
}
func (c *Counter)Inc()  {
	c.Count++
}
func test(){
	a:=Counter{Count: 20}
	b:=Counter{Count: 20}
	c:=&Counter{Count: 20}
	d:=&Counter{Count: 20}
	for i:=0;i<3;i++{
		a.Add()
		b.Inc()
		c.Add()
		d.Inc()
	}
	println(a.Count,b.Count,c.Count,d.Count)
}

执行结果

20 23 20 23
 

原因分析

成员函数调用时,成员变量会变为参数传递到函数中,在函数调用的时候其实也是对struct进行了复制,所以在写成员函数的时候,一般都写成指针类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值