golang-指针复习小记
简记
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拿来接住返回值替换即可