04.4.2.md

This commit is contained in:
Unknown
2013-04-23 17:24:02 -04:00
parent 47cb524ad5
commit 48ea39b502

View File

@@ -122,40 +122,39 @@ Example 4.5 [goos.go](examples/chapter_4/goos.go)
这里用到了 `Printf` 的格式化输出的功能(第 4.4.3 节)。
#4.4.2 值类型和引用类型
程序中所用到的内存在计算机中使用一堆箱子来表示(这也是人们在讲解它的时候的画法),这些箱子被称为 “ 字 ”。根据不同的处理器以及操作系统类型,所有的字都具有 32 位4 字节)或 64 位8 字节)的相同长度;所有的字都使用相关的内存地址来进行表示(以十六进制数表示)。
内存在计算机程序看来好比一堆箱子也就是我们将如何写入它们叫做单词写入。以目前的操作系统开发而言所有单词具有相同的长度为32位4字节或64位8字节;所有词都有确定的*内存地址*(以十六进制数表示)。
所有变量的基本原始类型如intfloatboolstring... 都是*值类型*,它们直接指向其内存中的值:
所有像 intfloatboolstring 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:
![](images/4.4.2_fig4.1.jpg?raw=true)
此外复合类型如数组(第 7 章)和结构体(见第 10 章)也是值类型。
另外,像数组(第 7 章)和结构第 10 章)这些复合类型也是值类型。
当使用 `=` 将一个类型的值赋值给另一个变量**j = i**i的原始值的副本拷贝到内存中。
当使用等号 `=` 将一个变量的值赋值给另一个变量时,如:`j = i`,实际上是在内存中将 i 的值进行了拷贝:
![](images/4.4.2_fig4.2.jpg?raw=true)
变量i的内存地址是i见 §4.9),例如:这可能是0xf840000040。值类型的变量在栈中存储
你可以通过 &i 来获取变量 i 的内存地址(第 4.9例如0xf840000040(每次的地址都可能不一样)。值类型的变量的值存储在栈中。
内存地址根据机器的不同有所不同,甚至相同的程序在不同的机器上执行也会不同因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。
内存地址根据机器的不同有所不同,甚至相同的程序在不同的机器上执行也会不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。
更复杂的数据类型,通常需要几个单词被视为引用类型。
更复杂的数据通常需要使用多个字,这些数据一般使用引用类型保存
一个引用类型的变量 r1 包含内存位置的地址(一个号码),这个地址存储着 r1 的值(或者是它的值的第一个词)
一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
![](images/4.4.2_fig4.3.jpg?raw=true)
这个地址被叫做指针(这与写值不同,更多详情见 § 4.9)也只包含一个单词
这个内存地址为称之为指针(你可以从上图中很清晰地看到,第 4.9 节将会详细说明),这个指针实际上也被存在另外的某一个字中
同一个引用类型指针指向不同的单词可以是连续的内存地址(内存布局被想成连续的)对计算来说是最有效的存储;或者这个词可以扩展,一个指向另一个
同一个引用类型指针指向的多个字可以是连续的内存地址(内存布局连续的),这也是计算效率最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址
分配 r2 = r1 只有引用(地址)被复制。
使用赋值语句 `r2 = r1`,只有引用(地址)被复制。
如果 r1 的值改变了,所有引用这个值(如 r1 和 r2都指向了更改的内容
如果 r1 的值改变了,那么这个值的所有引用都会指向被修改后的内容在这个例子中r2 也会受到影响
在 Go 语言中,指针(见 § 4.9)是引用类型,slices第 7 章maps7 章)和 channels (见第 13 章)也是引用类型。所引用的变量存储在堆中,进行垃圾收集,相比栈有更大的内存空间。
在 Go 语言中,指针( 4.9 节)属于引用类型,其它的引用类型还包括 slices第 7 章maps8 章)和 channel第 13 章)。被引用的变量存储在堆中,以便进行垃圾回收,且比栈有更大的内存空间。
## 4.4.3 打印
## 4.4.3 打印CHECK
函数 Printf 在 fmt 包外也是可见的,因为它以大写字母 P 开头,主要用于打印输出到控制台。通常使用的格式化字符串作为第一个参数: