golang的值传递

18 阅读1分钟

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