Frequently Asked Questions:函数参数传递类型?占用内存大小?

199 阅读2分钟

这是我参与更文挑战的第11天,活动详情查看:更文挑战

什么时候函数会传递值?

和所有C语言家族的成员一样,Go所有的参数传递都是值传递。也就是说,函数始终会传递的内容的一个副本,这就像好像一个指定的任务一样必须执行。举个例子,将int值传递给函数,会拷贝一个int的副本传递,如果传递的是指针值,那么会拷贝一个指针的副本,注意,并不是它指向的数据的副本。有关这种方式会如何影响方法接收的,请参阅后面的部分

映射(map)和切片(slice)的值表现类似于指针:它们一个是包含指向底层map或slice数据的指针描述符。拷贝一个map或者slice,并不会拷贝它所指向的数据。拷贝一个接口,就是拷贝这个接口存储的数据。如果这个接口的值是一个结构体,那么拷贝这个接口就是在拷贝一个结构体,如果这个接口的值是一个指针,那么,拷贝这个接口就是在拷贝这个指针,重要的事情说三遍,拷贝的内容不是这个指针指向的数据。

请注意,此讨论是关于操作的语义。实际实现中,可能会采用一些优化来避免复制, 只要优化不会更改语义即可。

optimization 最佳化
semantics  语义

为什么我的Go程序用了那么多的虚拟内存?

Go Memory 分配器会使用一个大空间,用于给Go程序分配内存。 此虚拟内存是GO的本地内存,不会剥夺其他内存进程。

要查找分配给Go流程的实际内存量,请使用UNIX TOP命令并,观察RES(Linux)或RSIZE(MacOS)列信息。

reserve 存储
arena 圆形剧场,活动空间
deprive 剥夺