本文转载自:http://colobu.com/2017/02/01/golang-summaries/ 原文:Golang SummariesbyTapirLiuima 本文是由TapirLiu总结的Golang中的一些知识点,对于深入学习Golang很有帮助,所以我特意翻译了一下。 1. 各种类型复制的时候的花费 本节标题也可以叫做“各种类型的值的大小” (the sizes of values of all kinds of types),底层可被不同的值共享的数据的大小未被计算。 下面的表格中一个
2. 可使用内建函数的类型 (
|
| len | cap | close | delete | make | |
|---|---|---|---|---|---|
| string | Yes | ||||
| array (and array pointer) | Yes | Yes | |||
| slice | Yes | Yes | Yes | ||
| map | Yes | Yes | Yes | ||
| channel | Yes | Yes | Yes | Yes |
上面的所有类型都可以使用range遍历。
可以用作len函数参数的类型也叫做容器类型。
假定容器的值可寻址(addressable)。
| Type | 长度可变 | 元素可更新 | 元素可寻址 | 查找会更改容器的长度 | 底层元素可以共享 |
|---|---|---|---|---|---|
| string | No | No | No | No | Yes |
| array | No | Yes | Yes | No | No |
| slice | No | Yes | Yes | No | Yes |
| map | Yes | Yes | No | No | Yes |
| channel | Yes | No | No | Yes | Yes |
T{...}的值比较Type (T) |
T{}是类型T的零值? |
|---|---|
| struct | Yes |
| array | Yes |
| slice | No (零值是nil) |
| map | No (零值是nil) |
nil的类型| Type (T) | Size Of T(nil) |
|---|---|
| pointer | 1 word |
| slice | 3 words |
| map | 1 word |
| channel | 1 word |
| function | 1 word |
| inte**ce | 2 words |
这些类型的零值的大小和上面类型的大小保持一致。
如果函数在编译时被执行,那么它的返回值是常量。
| Function | 返回值 | 编译时便计算? |
|---|---|---|
| unsafe.Sizeof | uintptr |
Yes, 总是 |
| unsafe.Alignof | ||
| unsafe.Offsetof | ||
| len | int |
有时候是 如果s是字符串常量,则 如果s是数组或者是数组指针,则 |
| cap | ||
| real |
float64(默认类型) |
有时候是 Go 规范中讲到: 如果 |
| imag | ||
| complex |
complex128(默认类型) |
有时候是 Go 规范中讲到: 如果 |
下面的值不能被寻址(addresses):
bytes in strings:字符串中的字节
map elements:map中的元素
dynamic values of inte**ce values (exposed by type assertions):接口的动态值
constant values:常量
literal values:字面值
package level functions:包级别的函数
methods (used as function values):方法
intermediate values:中间值
channel receive operations
sub-string operations
sub-slice operations
addition, subtraction, multiplication, and division, etc.
function callings
explicit value conversions
all sorts of operations, except pointer dereference operations, but including:
注意,