golang的值传递
参考
严格的来说,每次的函数调用,参数传递,都会创建一个新的变量的副本,copy底层数据结构,底层是指针则指向同一个内存地址区域。
语言的区别
值和地址传递的区分,主调函数在调用时候,是否给形参分配存储单元,分配了则是值传递,否则地址传递
- 【C语言】值传递和地址传递
- 地址传递的特点是形参并不存在存储空间,编译系统不为形参数组分配内存
可以看到这,实参和形参的打印的地址都是一样的,
// gcc -o main main.c
// ./main 即可打印结果
#include <stdio.h>
void say(int *px)
{
printf("px=0x%p \n", px);
}
int main(void)
{
int aa=10;
printf("aa=0x%p \n", &aa);
say(&aa);
return 0;
}
aa=0x0x16b8cb178
px=0x0x16b8cb178
- 【golang】里面只有【值传递】,所谓的引用传递(slice,map)其实都是内存地址copy,指向的都是同一个内存地址,
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
fmt.Printf("实参-nums %p\n", &nums)
say(nums)
}
func say(num2s []int) {
fmt.Printf("形参-num2 %p\n", &num2s)
}
实参-nums 0x140000aa018
形参-num2 0x140000aa030
package main
import "fmt"
func main() {
var aa = 10
fmt.Printf("形参-aa %p\n", &aa)
say(&aa)
}
func say(px *int) {
fmt.Printf("形参-px %p\n", &px)
}
形参-aa 0x1400011a018
形参-px 0x14000120020