栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Golang函数参数是否以写时复制形式传递?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Golang函数参数是否以写时复制形式传递?

从函数名称来看,即使考虑将参数移至全局变量以节省将参数作为参数传递所需的时间/空间,性能也不是那么关键(IO操作(如检查文件)比调用函数慢得多,而将价值传递给他们)。

Go中的slice只是小的描述符,类似于带有指向后备数组的指针和2

int
s(长度和容量)的结构。不管支持数组有多大,传递切片始终是高效的,您甚至不应该考虑将指针传递给它们,除非您当然想修改切片标头。

Go中的参数始终按值传递,并复制要传递的值。如果传递指针,则将复制并传递指针值。传递切片时,将复制并传递切片值(它是一个小的描述符)-它将指向相同的后备数组(不会被复制)。

同样,如果您需要多次访问函数中的切片,则参数通常会带来额外的好处,因为编译器可以进行进一步的优化/缓存,而如果它是全局变量,则必须格外小心。

有关切片及其内部的更多信息:转到切片:用法和内部

如果您想获得准确的性能数字,请进行基准测试!

这里有一些基准测试代码,它显示了两种解决方案之间没有区别(将slice作为参数传递或访问global
slice)。将其保存到类似的文件中

slices_test.go
,然后使用
go test -bench .

package mainimport (    "testing")var gslice = make([]string, 1000)func global(s string) {    for i := 0; i < 100; i++ { // Cycle to access slice may times        _ = s        _ = gslice // Access global-slice    }}func param(s string, ss []string) {    for i := 0; i < 100; i++ { // Cycle to access slice may times        _ = s        _ = ss // Access parameter-slice    }}func BenchmarkParameter(b *testing.B) {    for i := 0; i < b.N; i++ {        param("hi", gslice)    }}func BenchmarkGlobal(b *testing.B) {    for i := 0; i < b.N; i++ {        global("hi")    }}

输出示例:

testing: warning: no tests to runPASSBenchmarkParameter-2    30000000     55.4 ns/opBenchmarkGlobal-2       30000000     55.1 ns/opok      _/V_/workspace/IczaGo/src/play  3.569s


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号