go 的参数传递

 

再go语言中没有引用传递,所有都是按照值拷贝的方式传递的。

 

数组:实际就是堆栈上的一段连续内存,和c类似。(可以更加反编译代码推断 go tool compile -S main.go > main.S)

   但是再作为参数传递的时候,时当作一个对象,发生拷贝。通过汇报可以看到DUFFCOPY拷贝(https://www.jianshu.com/p/e6566f682b4e)

slice:makeslice 的时候,返回的是一个slice对象。

func makeslice(et *_type, len, cap int) slice {...}

slice定义如下:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

当作参数传递的时候,会拷贝对象,但是结构体中的array地址一样。

 

map:makemap的时候返回的时一个*hmap指针

func makemap(t *maptype, hint int, h *hmap) *hmap {...}

 

interface:

  关于interface的实现细节:https://research.swtch.com/interfaces

  从文章中我们可以知道interface实际是一个包含两部分的变量:第一部分指向接口类型;第二部分指向具体赋值给接口变量的值。如果值时指针,那么第二部分保存的时地址,如果值类型,那么赋值给interface的时候会发生拷贝而赋值给第二部分

 

转载于:https://www.cnblogs.com/hygblog/p/10584550.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值