值传递 #
函数传参有三种方式,分别是值传递(pass by value)、引用传递(pass by reference),以及指针传递(pass by pointer)。指针传递也称为地址传递,本质上也属于值传递,它只不过传递的值是地址而已。所以按照广义的函数传递来分,分为值传递和引用传递。Go语言中函数传参值传递,不支持引用传递。但是由于切片,通道,映射等具有引用传递的某些特性,往往令人疑惑其应该是引用传递。这个章节我们就来探究下Go语言中函数传递的问题。
在探究Go语言中函数传递的问题,我们先研究C++语言下的引用传递和指针传递是怎么回事。
C++中指针传递 #
#include <stdio.h>
void swap(int* a,int *b){
printf("交换中:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", *a, &a, *b, &b);
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 1;
int b = 2;
printf("交换前:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", a, &a, b, &b);
swap(&a,&b);
printf("交换后:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", a, &a, b, &b);
return 0;
}
C++中引用传递 #
#include <stdio.h>
void swap(int &a, int &b){
printf("交换中:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", a, &a, b, &b);
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 1;
int b = 2;
printf("交换前:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", a, &a, b, &b);
swap(a,b);
printf("交换后:变量a值:%d, 地址:%p; 变量b值:%d,地址:%p\n", a, &a, b, &b);
return 0;
}