简记

go的指针是不能运算的
*int 在类型前面加*表示指针
&a 在a变量前加&表示取a的地址
java/python都是引用传递,go是值传递
意味着调用参数的时候都需要复制一份值,保证性能使用指针

func main() {
	var a int = 2 
	var pa *int = &a //int指针类型pa = 取a的地址
	fmt.Println(pa) //输出 0x140000a2008
	*pa = 3 //让pa指向的地址,实际就是a = 3
	fmt.Println(a) //输出3
}

值传递与引用传递

值传递

主要是拷贝,但是不会改变原来的值

//c代码
void pass_by_val(int a){
    a++; //会复制参数的值到a,但是实际外面引用的a没有变
}
int main(){
    int a=3;
    pass_by_val(a);
    printf(a);  //3,没有对a进行+1
}

会复制参数的值到a,但是实际外面引用的a没有变。所以调用了 pass_by_val(a); 过后还是输出3

引用传递

//c代码
void pass_by_ref(int& a){
    a++; 直接在地址中对应a的位置修改
}
int main(){
    int a=3;
    pass_by_ref(a);
    printf(a);  //4,对a进行+1
}

直接对参数a的地址所在位置,实际上在对a进行操作,所以调用了 pass_by_ref(a); 过后输出4(在a=3上面+1)

例子

交换值(指针操作)

func swap(a, b *int) {
	*b, *a = *a, *b //直接对ab对指针对应位置交换
}
func main() {
	a, b := 3, 4
	fmt.Println(a, b)  //3,4
	swap(&a, &b)
	fmt.Println(a, b)  //4,3
}

⚠️ 这里对ab指针进行操作,实际上能够操作到ab。如果只是 a,b=b,a就交换不了,因为这种值传递的形式操作不到给的ab(只是把ab复制进去操作了,外面照样操作不了)

交换值(返回值替换)

func swap(a, b int) (int, int) {
	return b, a //丢回返回值,用以替换原来的ab
}
func main() {
	a, b := 3, 4
	fmt.Println(a, b) //3,4
	a, b = swap(a, b)
	fmt.Println(a, b)   //4,3
}

⚠️这里返回了值,将原来的ab复制进去,此时没有改变原来的ab。但是在调用的时候由于出来了交换后的返回值所以在原来的ab拿来接住返回值替换即可