1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 04:22:22 +00:00

ch1.3: 规范化图片编号

This commit is contained in:
chai2010 2018-08-14 20:43:22 +08:00
parent b03106c3c5
commit d62b47d38c
9 changed files with 15 additions and 4 deletions

View File

@ -27,7 +27,10 @@ var d = [...]int{1, 2, 4: 5, 6} // 定义一个长度为6的int类型数组, 元
数组的内存结构比较简单。比如下面是一个`[4]int{2,3,5,7}`数组值对应的内存结构:
![](../images/ch1-03-array-4int.ditaa.png)
![](../images/ch1.3-1-array-4int.ditaa.png)
*图 1.3-1 数组布局*
Go语言中数组是值语义。一个数组变量即表示整个数组它并不是隐式的指向第一个元素的指针比如C语言的数组而是一个完整的值。当一个数组变量被赋值或者被传递的时候实际上会复制整个数组。如果数组较大的话数组的赋值也会有较大的开销。为了避免复制数组带来的开销可以传递一个指向数组的指针但是数组指针并不是数组。
@ -158,7 +161,10 @@ type StringHeader struct {
我们可以看看字符串“Hello, world”本身对应的内存结构
![](../images/ch1-03-string-1.ditaa.png)
![](../images/ch1.3-2-string-1.ditaa.png)
*图 1.3-2 字符串布局*
分析可以发现“Hello, world”字符串底层数据和以下数组是完全一致的
@ -208,7 +214,9 @@ fmt.Println("\xe7\x95\x8c") // 打印: 界
下图展示了“Hello, 世界”字符串的内存结构布局:
![](../images/ch1-03-string-2.ditaa.png)
![](../images/ch1.3-3-string-2.ditaa.png)
*图 1.3-3 字符串布局*
Go语言的字符串中可以存放任意的二进制字节序列而且即使是UTF8字符序列也可能会遇到坏的编码。如果遇到一个错误的UTF8编码输入将生成一个特别的Unicode字符\uFFFD这个字符在不同的软件中的显示效果可能不太一样在印刷中这个符号通常是一个黑色六角形或钻石形状里面包含一个白色的问号<E58FB7>
@ -360,7 +368,10 @@ type SliceHeader struct {
可以看出切片的开头部分和Go字符串是一样的但是切片多了一个`Cap`成员表示切片指向的内存空间的最大容量(对应元素的个数,而不是字节数)。下图是`x := []int{2,3,5,7,11}``y := x[1:3]`两个切片对应的内存结构。
![](../images/ch1-03-slice-1.ditaa.png)
![](../images/ch1.3-4-slice-1.ditaa.png)
*图 1.3-4 切片布局*
让我们看看切片有哪些定义方式:

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB