回到简体

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,6 +1,6 @@
### 2.4.1. 元組賦
### 2.4.1. 元组赋
組賦值是另一形式的賦值語句,它允許同時更新多個變量的值。在值之前,賦值語句右的所有表達式將會先進行求值,然後再統一更新左邊對應變量的值。這對於處理有些同時出現在元組賦值語句左右兩邊的變量很有助,例如我可以這樣交換兩個變量的值:
组赋值是另一形式的赋值语句,它允许同时更新多个变量的值。在值之前,赋值语句右的所有表达式将会先进行求值,然后再统一更新左边对应变量的值。这对于处理有些同时出现在元组赋值语句左右两边的变量很有助,例如我可以这样交换两个变量的值:
```Go
x, y = y, x
@@ -8,7 +8,7 @@ x, y = y, x
a[i], a[j] = a[j], a[i]
```
或者是計算兩個整數值的的最大公約數GCD譯註GCD不是那敏感字而是greatest common divisor的縮寫,歐幾里德的GCD是最早的非平凡算法
或者是计算两个整数值的的最大公约数GCD译注GCD不是那敏感字而是greatest common divisor的缩写,欧几里德的GCD是最早的非平凡算法
```Go
func gcd(x, y int) int {
@@ -19,7 +19,7 @@ func gcd(x, y int) int {
}
```
或者是算斐波納契數Fibonacci的第N個數
或者是算斐波纳契数Fibonacci的第N个数
```Go
func fib(n int) int {
@@ -31,21 +31,21 @@ func fib(n int) int {
}
```
組賦值也可以使一繫列瑣碎賦值更加緊湊(譯註: 特别是在for循的初始化部分),
组赋值也可以使一系列琐碎赋值更加紧凑(译注: 特别是在for循的初始化部分),
```Go
i, j, k = 2, 3, 5
```
但如果表式太複雜的話,應該盡量避免度使用元組賦值;因爲每個變量單獨賦值語句的法可讀性會更好。
但如果表式太复杂的话,应该尽量避免度使用元组赋值;因为每个变量单独赋值语句的法可读性会更好。
有些表達式會産生多值,比如調用一有多個返迴值的函數。當這樣一個函數調用出在元組賦值右的表式中時(譯註:右不能再有其它表式),左邊變量的目必和右一致。
有些表达式会产生多值,比如用一有多个返回值的函数。当这样一个函数调用出在元组赋值右的表式中时(译注:右不能再有其它表式),左边变量的目必和右一致。
```Go
f, err = os.Open("foo.txt") // function call returns two values
```
通常,這類函數會用額外的返迴值來表達某種錯誤類例如os.Open是用外的返值返迴一個error型的錯誤,還有一些是用來返迴布爾值,通常被稱爲ok。在稍後我們將看到的三操作都是似的用法。如果map§4.3)、類型斷§7.10或通道接收§8.4.2)出現在賦值語句的右,它都可能會産生兩個結果,有一個額外的布爾結果表示操作是否成功:
通常,这类函数会用额外的返回值来表达某种错误类例如os.Open是用外的返值返回一个error型的错误,还有一些是用来返回布尔值,通常被称为ok。在稍后我们将看到的三操作都是似的用法。如果map§4.3)、类型断§7.10或通道接收§8.4.2)出现在赋值语句的右,它都可能会产生两个结果,有一个额外的布尔结果表示操作是否成功:
```Go
v, ok = m[key] // map lookup
@@ -53,22 +53,22 @@ v, ok = x.(T) // type assertion
v, ok = <-ch // channel receive
```
譯註map§4.3)、類型斷§7.10或通道接收§8.4.2)出現在賦值語句的右邊時,併不一定是産生兩個結果,也可能隻産生一個結果。對於值産生一個結果的情形map找失敗時會返迴零值,類型斷言失敗時會發送運行時panic常,通道接收失敗時會返迴零值(阻塞不算是失)。例如下面的例子:
译注map§4.3)、类型断§7.10或通道接收§8.4.2)出现在赋值语句的右边时,并不一定是产生两个结果,也可能只产生一个结果。对于值产生一个结果的情形map找失败时会返回零值,类型断言失败时会发送运行时panic常,通道接收失败时会返回零值(阻塞不算是失)。例如下面的例子:
```Go
v = m[key] // map找,失敗時返迴零值
v = x.(T) // type言,失敗時panic
v = <-ch // 管道接收,失敗時返迴零值(阻塞不算是失
v = m[key] // map找,失败时返回零值
v = x.(T) // type言,失败时panic
v = <-ch // 管道接收,失败时返回零值(阻塞不算是失
_, ok = m[key] // map返迴2個
_, ok = mm[""], false // map返迴1個
_ = mm[""] // map返迴1個
_, ok = m[key] // map返回2个
_, ok = mm[""], false // map返回1个
_ = mm[""] // map返回1个
```
變量聲明一,我可以用下劃線空白標識`_`來丟棄不需要的值。
变量声明一,我可以用下划线空白标识`_`来丢弃不需要的值。
```Go
_, err = io.Copy(dst, src) // 丟棄字節數
_, ok = x.(T) // 隻檢測類型,忽略具
_, err = io.Copy(dst, src) // 丢弃字节数
_, ok = x.(T) // 只检测类型,忽略具
```