文档章节

Golang Tips:传递各类型参数的空间代价

风华神使
 风华神使
发布于 2015/10/19 02:26
字数 460
阅读 333
收藏 2

函数调用时,实参的值会复制到形参。

对于int32,uint64等形如intN,uintN的类型,传递的代价是显而易见的,例如传递一个int32需要4个字节。int和uint是平台相关,均为4字节(32位)或8字节(64位),uintptr与任何类型的指针都是4字节(32位)或8字节(64位)。float32和float64分别需要4字节和8字节,complex64和complex128分别相当于两个float32和两个float64。

字符串(string)、切片(slice)、接口(interface)、字典(map)、channel不是那么显而易见,但通过让Go生成C库以便看出一些端倪。

Go生成C库时会自动生成一个头文件(.h),部分内容如下:

typedef struct { char *p; GoInt n; } GoString;
typedef void *GoMap;
typedef void *GoChan;
typedef struct { void *t; void *v; } GoInterface;
typedef struct { void *data; GoInt len; GoInt cap; } GoSlice;

其中,GoInt在32位和64位下分别相当于(C语言的)int32_t和int64_t,GoUint类似。

由此可见,Go在传递字符串的时候,传递的代价相当于一个指针和一个(Go的)int。当然,如果在函数体中修改了字符串形参,Go会为这个字符串生成一个(深)拷贝。

传递一个map或chan都相当于传递了一个指针,所以,传递它们的代价是很小的,性能很高的。

传递一个interface的代价是两个指针(可能一个标识类型,一个标识方法集)。

传递一个slice的代价是一个指针加两个(Go的)int。


数组和结构体:

Go的数组是纯粹的值类型,传递一个[N]T的代价是N个T。

传递一个结构体的代价是每个字段大小的总和(暂不考虑对齐问题)。

© 著作权归作者所有

共有 人打赏支持
风华神使
粉丝 25
博文 77
码字总数 42460
作品 0
南开
架构师
私信 提问
golang面向对象思想和实现

golang中并没有明确的面向对象的说法,实在要扯上的话,可以将struct比作其它语言中的class。 类声明 这样就声明了一个类,其中没有public、protected、private的的声明。golang用另外一种做...

平凡之路
2016/07/13
18
0
说说不知道的Golang中参数传递

本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为。在golang中...

腾讯云加社区
01/16
0
0
年终盘点!2017年超有价值的Golang文章

年终盘点!2017年超有价值的Golang文章 鸟窝2017-12-281 阅读 Go 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍。 文章排名部分先后...

鸟窝
2017/12/28
0
0
🐶年学 go 1:变量&函数

变量&函数 最近在学习golang,写下学习笔记提升记忆。 为了看起来不是那么枯燥,本学习笔记采用分析代码的形式。 首先搬出我们最经典的第一段代码: hello world 首先我们要认识到 每个Go 程序...

2018/02/22
0
0
golang实现http的get和post

golang要请求远程网页,可以使用net/http包中的client提供的方法实现。查看了官方网站有一些示例,没有太全面的例子,于是自己整理了一下。 get请求 get请求可以直接http.Get方法,非常简单。...

徐学良
2016/11/17
48
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在NEO区块链上实现信息加密

你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的...

NEO-FANS
14分钟前
1
0
web.xml is missing and is set to true一步解决

次报错说的是在WebContent/WEB-INF下面没有web.xml,而默认web.xml不在此路径,需要重新指定路径,操作如下: 先取消Dynamic Web Module勾选,点击apply,然后再勾上Dynamic Web Module,此时...

宇昕
21分钟前
0
0
ios 让navigationItem的UIBarButtonItem的背景色不为蓝色,现实图片本身颜色

ios 让navigationItem的UIBarButtonItem的背景色不为蓝色,现实图片本身颜色 UIImage *rightImage = [[UIImage imageNamed:@"add"] imageWithRenderingMode:UIImageRenderingModeAlwaysOrig......

壹峰
29分钟前
0
0
spring session 1.x与2.x 兼容性问题

spring session 1.x与2.x 同时在项目中使用时,导致session不一致原因是1.x useBase64Encoding=false 而 2.0 为useBase64Encoding=true. 因此解决只需保证两边 useBase64Encoding 一致就行。...

welkin_k
29分钟前
2
0
Hadoop环境中管理大数据存储八大技巧

在现如今,随着IT互联网信息技术的飞速发展和进步。目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面科多数据介绍一下关于Hadoop环境中管理大数据存储技巧。 1、分布式存...

董黎明
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部