如果Go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针。(C/C++区分)
首先看一下C++的代码:
#include <iostream>
#include<map>
using namespace std;
void fun(int a[]){
a[0]=100;
}
int main(){
int a[4]={1,2,3,4};
fun(a);
cout<<a[0];
return 0;
}
执行结果:a[0]=100
再看一下golang的代码:
package main
import "fmt"
func sum(a [4]int){
a[0]=100
}
func main(){
a:=[4]int{1,1,1,1}//数组
sum(a)
fmt.Println(a[0])
}
执行结果:a[0]=1
go语言中针对这种问题解决方法有两种:
方法一:传递数组的地址操作
package main
import "fmt"
func sum(a *[4]int){//指针
a[0]=100
}
func main(){
a:=[4]int{1,1,1,1}
sum(&a)//引用
fmt.Println(a[0])
}
执行结果:a[0]=100
方法二:使用切片代替数组(切片和数组的区别可参考:切片数组区别)
package main
import "fmt"
func sum(a []int){
a[0]=100
}
func main(){
a:=[]int{1,1,1,1}//切片
sum(a)
fmt.Println(a[0])
}
执行结果:a[0]=100