传值:数组
传引用:切片
举例:
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进行了复制,所以在写成员函数的时候,一般都写成指针类型