国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Go 語(yǔ)言 賦值

2023-03-14 16:49 更新

原文鏈接:https://gopl-zh.github.io/ch2/ch2-04.html


2.4. 賦值

使用賦值語(yǔ)句可以更新一個(gè)變量的值,最簡(jiǎn)單的賦值語(yǔ)句是將要被賦值的變量放在=的左邊,新值的表達(dá)式放在=的右邊。

x = 1                       // 命名變量的賦值
*p = true                   // 通過(guò)指針間接賦值
person.name = "bob"         // 結(jié)構(gòu)體字段賦值
count[x] = count[x] * scale // 數(shù)組、slice或map的元素賦值

特定的二元算術(shù)運(yùn)算符和賦值語(yǔ)句的復(fù)合操作有一個(gè)簡(jiǎn)潔形式,例如上面最后的語(yǔ)句可以重寫(xiě)為:

count[x] *= scale

這樣可以省去對(duì)變量表達(dá)式的重復(fù)計(jì)算。

數(shù)值變量也可以支持?++?遞增和?--?遞減語(yǔ)句(譯注:自增和自減是語(yǔ)句,而不是表達(dá)式,因此x = i++之類(lèi)的表達(dá)式是錯(cuò)誤的):

v := 1
v++    // 等價(jià)方式 v = v + 1;v 變成 2
v--    // 等價(jià)方式 v = v - 1;v 變成 1

2.4.1. 元組賦值

元組賦值是另一種形式的賦值語(yǔ)句,它允許同時(shí)更新多個(gè)變量的值。在賦值之前,賦值語(yǔ)句右邊的所有表達(dá)式將會(huì)先進(jìn)行求值,然后再統(tǒng)一更新左邊對(duì)應(yīng)變量的值。這對(duì)于處理有些同時(shí)出現(xiàn)在元組賦值語(yǔ)句左右兩邊的變量很有幫助,例如我們可以這樣交換兩個(gè)變量的值:

x, y = y, x

a[i], a[j] = a[j], a[i]

或者是計(jì)算兩個(gè)整數(shù)值的的最大公約數(shù)(GCD)(譯注:GCD不是那個(gè)敏感字,而是greatest common divisor的縮寫(xiě),歐幾里德的GCD是最早的非平凡算法):

func gcd(x, y int) int {
    for y != 0 {
        x, y = y, x%y
    }
    return x
}

或者是計(jì)算斐波納契數(shù)列(Fibonacci)的第N個(gè)數(shù):

func fib(n int) int {
    x, y := 0, 1
    for i := 0; i < n; i++ {
        x, y = y, x+y
    }
    return x
}

元組賦值也可以使一系列瑣碎賦值更加緊湊(譯注: 特別是在for循環(huán)的初始化部分):

i, j, k = 2, 3, 5

但如果表達(dá)式太復(fù)雜的話,應(yīng)該盡量避免過(guò)度使用元組賦值;因?yàn)槊總€(gè)變量單獨(dú)賦值語(yǔ)句的寫(xiě)法可讀性會(huì)更好。

有些表達(dá)式會(huì)產(chǎn)生多個(gè)值,比如調(diào)用一個(gè)有多個(gè)返回值的函數(shù)。當(dāng)這樣一個(gè)函數(shù)調(diào)用出現(xiàn)在元組賦值右邊的表達(dá)式中時(shí)(譯注:右邊不能再有其它表達(dá)式),左邊變量的數(shù)目必須和右邊一致。

f, err = os.Open("foo.txt") // function call returns two values

通常,這類(lèi)函數(shù)會(huì)用額外的返回值來(lái)表達(dá)某種錯(cuò)誤類(lèi)型,例如os.Open是用額外的返回值返回一個(gè)error類(lèi)型的錯(cuò)誤,還有一些是用來(lái)返回布爾值,通常被稱為ok。在稍后我們將看到的三個(gè)操作都是類(lèi)似的用法。如果map查找(§4.3)、類(lèi)型斷言(§7.10)或通道接收(§8.4.2)出現(xiàn)在賦值語(yǔ)句的右邊,它們都可能會(huì)產(chǎn)生兩個(gè)結(jié)果,有一個(gè)額外的布爾結(jié)果表示操作是否成功:

v, ok = m[key]             // map lookup
v, ok = x.(T)              // type assertion
v, ok = <-ch               // channel receive

譯注:map查找(§4.3)、類(lèi)型斷言(§7.10)或通道接收(§8.4.2)出現(xiàn)在賦值語(yǔ)句的右邊時(shí),并不一定是產(chǎn)生兩個(gè)結(jié)果,也可能只產(chǎn)生一個(gè)結(jié)果。對(duì)于只產(chǎn)生一個(gè)結(jié)果的情形,map查找失敗時(shí)會(huì)返回零值,類(lèi)型斷言失敗時(shí)會(huì)發(fā)生運(yùn)行時(shí)panic異常,通道接收失敗時(shí)會(huì)返回零值(阻塞不算是失?。?。例如下面的例子:

v = m[key]                // map查找,失敗時(shí)返回零值
v = x.(T)                 // type斷言,失敗時(shí)panic異常
v = <-ch                  // 管道接收,失敗時(shí)返回零值(阻塞不算是失?。?
_, ok = m[key]            // map返回2個(gè)值
_, ok = mm[""], false     // map返回1個(gè)值
_ = mm[""]                // map返回1個(gè)值

和變量聲明一樣,我們可以用下劃線空白標(biāo)識(shí)符?_?來(lái)丟棄不需要的值。

_, err = io.Copy(dst, src) // 丟棄字節(jié)數(shù)
_, ok = x.(T)              // 只檢測(cè)類(lèi)型,忽略具體值

2.4.2. 可賦值性

賦值語(yǔ)句是顯式的賦值形式,但是程序中還有很多地方會(huì)發(fā)生隱式的賦值行為:函數(shù)調(diào)用會(huì)隱式地將調(diào)用參數(shù)的值賦值給函數(shù)的參數(shù)變量,一個(gè)返回語(yǔ)句會(huì)隱式地將返回操作的值賦值給結(jié)果變量,一個(gè)復(fù)合類(lèi)型的字面量(§4.2)也會(huì)產(chǎn)生賦值行為。例如下面的語(yǔ)句:

medals := []string{"gold", "silver", "bronze"}

隱式地對(duì)slice的每個(gè)元素進(jìn)行賦值操作,類(lèi)似這樣寫(xiě)的行為:

medals[0] = "gold"
medals[1] = "silver"
medals[2] = "bronze"

map和chan的元素,雖然不是普通的變量,但是也有類(lèi)似的隱式賦值行為。

不管是隱式還是顯式地賦值,在賦值語(yǔ)句左邊的變量和右邊最終的求到的值必須有相同的數(shù)據(jù)類(lèi)型。更直白地說(shuō),只有右邊的值對(duì)于左邊的變量是可賦值的,賦值語(yǔ)句才是允許的。

可賦值性的規(guī)則對(duì)于不同類(lèi)型有著不同要求,對(duì)每個(gè)新類(lèi)型特殊的地方我們會(huì)專(zhuān)門(mén)解釋。對(duì)于目前我們已經(jīng)討論過(guò)的類(lèi)型,它的規(guī)則是簡(jiǎn)單的:類(lèi)型必須完全匹配,nil可以賦值給任何指針或引用類(lèi)型的變量。常量(§3.6)則有更靈活的賦值規(guī)則,因?yàn)檫@樣可以避免不必要的顯式的類(lèi)型轉(zhuǎn)換。

對(duì)于兩個(gè)值是否可以用==!=進(jìn)行相等比較的能力也和可賦值能力有關(guān)系:對(duì)于任何類(lèi)型的值的相等比較,第二個(gè)值必須是對(duì)第一個(gè)值類(lèi)型對(duì)應(yīng)的變量是可賦值的,反之亦然。和前面一樣,我們會(huì)對(duì)每個(gè)新類(lèi)型比較特殊的地方做專(zhuān)門(mén)的解釋。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)