回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,10 +1,10 @@
### 2.3.2. 指
### 2.3.2. 指
個變量對應一個保存了變量對應類型值的存空。普通量在聲明語句創建時被綁定到一個變量名比如叫x的量,但是有很多量始以表式方式引入例如x[i]或x.f量。所有些表式一般都是取一個變量的值,除非它是出現在賦值語句的左邊,這種時候是給對應變量賦予一新的值。
个变量对应一个保存了变量对应类型值的存空。普通量在声明语句创建时被绑定到一个变量名比如叫x的量,但是有很多量始以表式方式引入例如x[i]或x.f量。所有些表式一般都是取一个变量的值,除非它是出现在赋值语句的左边,这种时候是给对应变量赋予一新的值。
個指針的值是另一個變量的地址。一個指針對應變量在存中的存位置。不是每一值都有一個內存地址,但是對於每一個變量必然有對應的內存地址。通過指針,我可以直接或更新對應變量的值,而不需要知道該變量的名字(如果量有名字的)。
个指针的值是另一个变量的地址。一个指针对应变量在存中的存位置。不是每一值都有一个内存地址,但是对于每一个变量必然有对应的内存地址。通过指针,我可以直接或更新对应变量的值,而不需要知道该变量的名字(如果量有名字的)。
如果用“var x int”聲明語句聲明一個x變量,那&x表取x量的存地址)將産生一指向該整數變量的指,指針對應的數據類型是`*int`,指針被稱之爲“指向int型的指”。如果指名字p可以“p指指向量x”或者“p指保存了x量的存地址”。同`*p`達式對應p指指向的量的值。一般`*p`達式讀取指指向的量的值,這里爲int型的值,同時因爲`*p`對應一個變量,所以該表達式也可以出現在賦值語句的左,表示更新指所指向的量的值。
如果用“var x int”声明语句声明一个x变量,那&x表取x量的存地址)将产生一指向该整数变量的指,指针对应的数据类型是`*int`,指针被称之为“指向int型的指”。如果指名字p可以“p指指向量x”或者“p指保存了x量的存地址”。同`*p`达式对应p指指向的量的值。一般`*p`达式读取指指向的量的值,这里为int型的值,同时因为`*p`对应一个变量,所以该表达式也可以出现在赋值语句的左,表示更新指所指向的量的值。
```Go
x := 1
@@ -14,18 +14,18 @@ fmt.Println(*p) // "1"
fmt.Println(x) // "2"
```
對於聚合型每個成員——比如結構體的每字段、或者是數組的每元素——也都是對應一個變量,因此可以被取地址。
对于聚合型每个成员——比如结构体的每字段、或者是数组的每元素——也都是对应一个变量,因此可以被取地址。
量有候被稱爲可尋址的值。卽使變量由表達式臨時生成,那麽表達式也必能接受`&`取地址操作。
量有候被称为可寻址的值。即使变量由表达式临时生成,那么表达式也必能接受`&`取地址操作。
任何型的指的零值都是nil。如果`p != nil`測試爲眞,那p是指向某有效量。指針之間也是可以行相等測試的,隻有當它們指向同一個變量或全部是nil才相等。
任何型的指的零值都是nil。如果`p != nil`测试为真,那p是指向某有效量。指针之间也是可以行相等测试的,只有当它们指向同一个变量或全部是nil才相等。
```Go
var x, y int
fmt.Println(&x == &x, &x == &y, &x == nil) // "true false false"
```
在Go言中,返迴函數中局部量的地址也是安全的。例如下面的代調用f函數時創建局部量v在局部量地址被返迴之後依然有效,因爲指針p依然引用這個變量。
在Go言中,返回函数中局部量的地址也是安全的。例如下面的代调用f函数时创建局部量v在局部量地址被返回之后依然有效,因为指针p依然引用这个变量。
```Go
var p = f()
@@ -36,17 +36,17 @@ func f() *int {
}
```
每次調用f函數都將返迴不同的果:
每次用f函数都将返回不同的果:
```Go
fmt.Println(f() == f()) // "false"
```
爲指針包含了一個變量的地址,因此如果將指針作爲參數調用函,那可以在函中通過該指針來更新量的值。例如下面這個例子就是通過指針來更新量的值,然後返迴更新的值,可用在一個表達式中譯註這是對C語言中`++v`操作的模擬,這里隻是爲了説明指的用法incr函數模擬的做法不推
为指针包含了一个变量的地址,因此如果将指针作为参数调用函,那可以在函中通过该指针来更新量的值。例如下面这个例子就是通过指针来更新量的值,然后返回更新的值,可用在一个表达式中译注这是对C语言中`++v`操作的模拟,这里只是为了说明指的用法incr函数模拟的做法不推
```Go
func incr(p *int) int {
*p++ // 非常重要:是增加p指向的量的值,不改p指
*p++ // 非常重要:是增加p指向的量的值,不改p指
return *p
}
@@ -55,9 +55,9 @@ incr(&v) // side effect: v is now 2
fmt.Println(incr(&v)) // "3" (and v is 3)
```
每次我們對一個變量取地址,或者複製指針,我都是爲原變量創建了新的别名。例如,`*p`就是是 量v的别名。指特别有值的地方在於我們可以不用名字而訪問一個變量,但是是一把雙刃劍:要找到一個變量的所有訪問者併不容易,我們必須知道量全部的别名(譯註:這是Go言的垃圾收器所做的工作)。不僅僅是指針會創建别名,很多其他引用型也會創建别名例如slice、map和chan甚至結構體、數組和接口都會創建所引用量的别名。
每次我们对一个变量取地址,或者复制指针,我都是为原变量创建了新的别名。例如,`*p`就是是 量v的别名。指特别有值的地方在于我们可以不用名字而访问一个变量,但是是一把双刃剑:要找到一个变量的所有访问者并不容易,我们必须知道量全部的别名(译注:这是Go言的垃圾收器所做的工作)。不仅仅是指针会创建别名,很多其他引用型也会创建别名例如slice、map和chan甚至结构体、数组和接口都会创建所引用量的别名。
針是實現標準庫中flag包的關鍵技術,它使用命令行參數來設置對應變量的值,而這些對應命令行標誌參數的變量可能零散分布在整程序中。爲了説明這一點在早些的echo版本中就包含了兩個可選的命令行參數`-n`忽略行尾的行符,`-s sep`指定分隔字符(默是空格)。下面是第四版本,對應包路徑爲gopl.io/ch2/echo4。
针是实现标准库中flag包的关键技术,它使用命令行参数来设置对应变量的值,而这些对应命令行标志参数的变量可能零散分布在整程序中。为了说明这一点在早些的echo版本中就包含了两个可选的命令行参数`-n`忽略行尾的行符,`-s sep`指定分隔字符(默是空格)。下面是第四版本,对应包路径为gopl.io/ch2/echo4。
<u><i>gopl.io/ch2/echo4</i></u>
```Go
@@ -82,11 +82,11 @@ func main() {
}
```
調用flag.Bool函數會創建一新的對應布爾型標誌參數的變量。它有三個屬性:第一是的命令行標誌參數的名字“n”後是該標誌參數的默值(里是false後是該標誌參數對應的描述信息。如果用在命令行入了一個無效的標誌參數,或者`-h``-help`參數,那麽將打印所有標誌參數的名字、默值和描述信息。似的,調用flag.String函數將於創建一個對應字符串型的標誌參數變量,同包含命令行標誌參數對應的參數名、默值、和描述信息。程序中的`sep``n`量分别是指向對應命令行標誌參數變量的指,因此必`*sep``*n`形式的指針語法間接引用它
用flag.Bool函数会创建一新的对应布尔型标志参数的变量。它有三个属性:第一是的命令行标志参数的名字“n”后是该标志参数的默值(里是false后是该标志参数对应的描述信息。如果用在命令行入了一个无效的标志参数,或者`-h``-help`参数,那么将打印所有标志参数的名字、默值和描述信息。似的,用flag.String函数将于创建一个对应字符串型的标志参数变量,同包含命令行标志参数对应的参数名、默值、和描述信息。程序中的`sep``n`量分别是指向对应命令行标志参数变量的指,因此必`*sep``*n`形式的指针语法间接引用它
程序運行時,必在使用標誌參數對應的變量之前調用先flag.Parse函,用更新每個標誌參數對應變量的值(之前是默值)。對於非標誌參數的普通命令行參數可以通過調用flag.Args()函數來訪問,返迴值對應對應一個字符串型的slice。如果在flag.Parse函解析命令行參數時遇到錯誤,默認將打印相的提示信息,然後調用os.Exit(2)止程序。
程序运行时,必在使用标志参数对应的变量之前用先flag.Parse函,用更新每个标志参数对应变量的值(之前是默值)。对于非标志参数的普通命令行参数可以通过调用flag.Args()函数来访问,返回值对应对应一个字符串型的slice。如果在flag.Parse函解析命令行参数时遇到错误,默认将打印相的提示信息,然后调用os.Exit(2)止程序。
讓我們運行一些echo測試用例:
让我们运行一些echo测试用例:
```
$ go build gopl.io/ch2/echo4