直接说结论:go 的函数参数传递都是值传递(无论传值还是指针)
值类型、引用类型
值类型:变量和变量的值存在同一个位置;
引用类型:变量和值存在不同的位置,变量存储的是值的地址;比如go里的 map、slice、chan是引用类型;
值传递、指针传递
值传递:就是函数在调用时将实际参数复制一份传递到函数中,函数内对值进行的任何操作都不会影响到实际参数;
指针传递:函数调用时将实际参数的地址传递到函数中,函数内对参数进行的修改将影响实际参数;
最后
go函数在传递参数时都会将参数复制一份,不过值传递复制的是值本身,指针传递是将地址复制一份,本质上都是对变量存储位置的数据执行了复制操作;
具体使用哪种方式传递,可从一下方面考虑:
- 结构体的大小:如果结构体比较大,使用指针传递效率高,因为只需要复制地址即可,而不是结构体本身;否则传值和传指针性能差异不大;
- 是否需要原始结构体:如果需要在函数中修改原始结构体的,那么使用指针;