首页 存档 技术 查看内容

[译]Golang 知识点总结

2018-3-30 13:00 |来自: 互联网 391 0

摘要: 本文转载自:http://colobu.com/2017/02/01/golang-summaries/ 原文:Golang SummariesbyTapirLiuima 本文是由TapirLiu总结的Golang中的一些知识点,对于深入学习Golang很有帮助,所以我特意翻译了一下。 1. 各种类 ...

本文转载自:http://colobu.com/2017/02/01/golang-summaries/


原文:Golang SummariesbyTapirLiuima

本文是由TapirLiu总结的Golang中的一些知识点,对于深入学习Golang很有帮助,所以我特意翻译了一下。

1. 各种类型复制的时候的花费

本节标题也可以叫做“各种类型的值的大小” (the sizes of values of all kinds of types),底层可被不同的值共享的数据的大小未被计算。

下面的表格中一个word在32bit操作系统中代表4个字节,在64bit操作系统中代表8个字节,内容基于官方的Go 1.7的编译器。

Type Cost Of Value Copying (Value Size)
bool 1 byte
int8, uint8, byte 1 byte
int16, uint16 2 bytes
int32, uint32, rune 4 bytes
int64, uint64 8 bytes
int, uint, uintptr 1 word
string 2 words
pointer 1 word
slice 3 words
map 1 word
channel 1 word
function 1 word
inte**ce 2 words
struct the sum of sizes of all fields
array (element value size) * (array length)

2. 可使用内建函数的类型 (lencapclosedeletemake)


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函数参数的类型也叫做容器类型。

3. 内建容器类型的值比较

假定容器的值可寻址(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

4. 组合类型T{...}的值比较

Type (T) T{}是类型T的零值?
struct Yes
array Yes
slice No (零值是nil)
map No (零值是nil)

5. 零值是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

这些类型的零值的大小和上面类型的大小保持一致。

6. 编译时被执行的函数

如果函数在编译时被执行,那么它的返回值是常量。

Function 返回值 编译时便计算?
unsafe.Sizeof uintptr Yes, 总是
unsafe.Alignof
unsafe.Offsetof
len int 有时候是

Go 规范中讲到:

  • 如果s是字符串常量,则len(s)是常量.

  • 如果s是数组或者是数组指针,则len(s)是常量.

  • cap
    real float64
    (默认类型)
    有时候是

    Go 规范中讲到: 如果s是复数常量,则real(s)imag(s)是常量.

    imag
    complex complex128
    (默认类型)
    有时候是

    Go 规范中讲到: 如果srsi都是常量,则complex(sr, si)是常量.

    7. 不能被寻址的值

    下面的值不能被寻址(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:



    注意,

    声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

    路过

    雷人

    握手

    鲜花

    鸡蛋

    相关分类

    返回顶部