mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-11 22:53:43 +08:00
04.4.2.md
This commit is contained in:
@@ -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字节);所有词都有确定的*内存地址*(以十六进制数表示)。
|
||||
|
||||
所有变量的基本(原始)类型,如int,float,bool,string,... 都是*值类型*,它们直接指向其内存中的值:
|
||||
所有像 int,float,bool,string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值:
|
||||
|
||||

|
||||
|
||||
此外复合类型如数组(见第 7 章)和结构体(见第 10 章)也都是值类型。
|
||||
另外,像数组(第 7 章)和结构(第 10 章)这些复合类型也是值类型。
|
||||
|
||||
当使用 `=` 将一个类型的值赋值给另一个变量:**j = i**,i的原始值的副本拷贝到内存中。
|
||||
当使用等号 `=` 将一个变量的值赋值给另一个变量时,如:`j = i`,实际上是在内存中将 i 的值进行了拷贝:
|
||||
|
||||

|
||||
|
||||
变量i的内存地址是&i(见 §4.9),例如:这可能是0xf840000040。值类型的变量在栈中存储。
|
||||
你可以通过 &i 来获取变量 i 的内存地址(第 4.9 节),例如:0xf840000040(每次的地址都可能不一样)。值类型的变量的值存储在栈中。
|
||||
|
||||
内存地址根据机器的不同会有所不同,甚至相同的程序在不同的机器上执行也会不同,因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。
|
||||
内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址。因为每台机器可能有不同的存储器布局,并且位置分配也可能不同。
|
||||
|
||||
更复杂的数据类型,通常需要几个单词被视为引用类型。
|
||||
更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。
|
||||
|
||||
一个引用类型的变量 r1 包含内存位置的地址(一个号码),这个地址存储着 r1 的值(或者是它的值的第一个词)
|
||||
一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
|
||||
|
||||

|
||||
|
||||
这个地址被叫做指针(这与写值不同,更多详情见 § 4.9)也只包含一个单词。
|
||||
这个内存地址为称之为指针(你可以从上图中很清晰地看到,第 4.9 节将会详细说明),这个指针实际上也被存在另外的某一个字中。
|
||||
|
||||
同一个引用类型指针指向不同的单词可以是连续的内存地址(内存布局被想成连续的)对计算来说是最有效的存储;或者这个词可以扩展,一个指向另一个。
|
||||
同一个引用类型的指针指向的多个字可以是在连续的内存地址中(内存布局是连续的),这也是计算效率最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。
|
||||
|
||||
当分配 r2 = r1, 只有引用(地址)被复制。
|
||||
当使用赋值语句 `r2 = r1` 时,只有引用(地址)被复制。
|
||||
|
||||
如果 r1 的值改变了,所有引用这个值(如 r1 和 r2)都指向了更改的内容。
|
||||
如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。
|
||||
|
||||
在 Go 语言中,指针(见 § 4.9)是引用类型,slices(见第 7 章),maps(见第 7 章)和 channels (见第 13 章)也是引用类型。所引用的变量存储在堆中,进行垃圾收集,相比栈,有更大的内存空间。
|
||||
在 Go 语言中,指针(第 4.9 节)属于引用类型,其它的引用类型还包括 slices(第 7 章),maps(第 8 章)和 channel(第 13 章)。被引用的变量会存储在堆中,以便进行垃圾回收,且比栈拥有更大的内存空间。
|
||||
|
||||
## 4.4.3 打印
|
||||
## 4.4.3 打印CHECK
|
||||
|
||||
函数 Printf 在 fmt 包外也是可见的,因为它以大写字母 P 开头,主要用于打印输出到控制台。通常使用的格式化字符串作为第一个参数:
|
||||
|
||||
|
Reference in New Issue
Block a user