在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/GO/ go的多重賦值問(wèn)題

go的多重賦值問(wèn)題

package main

import ("fmt")

func fibonacci() func(int) int {
    pre_pre, pre := 1, 1;
    return func(x int) int {
        if x == 0 || x == 1 {
            return pre
        } else {
            tmp := pre_pre + pre

            //第一種
            //pre_pre = pre
            //pre = tmp

            //第二種
            //pre_pre, pre = pre, tmp

            //第三種
            pre, pre_pre = tmp, pre

            return tmp
        }
    } 
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f(i))
    }
}

用迭代輸出斐波那契數(shù)列,在迭代數(shù)列中兩個(gè)前置數(shù)的時(shí)候,我用了3種方法:
注釋中的第一種,最常見(jiàn)的。
注釋中的第二種和第三種,用了go的多重賦值的特性。
關(guān)鍵是:第二種第三種都能正確輸出數(shù)列
這我就納悶了,這個(gè)多重賦值的執(zhí)行順序到底是怎樣的?它是怎么正確解析出我的賦值步驟的(即第一種里面的步驟)?

回答
編輯回答
愛(ài)是癌

執(zhí)行順序從左到右,但左邊被賦值的變量在表達(dá)式的下一行才生效。

a, b = b, a+1 可理解成

temp_a = a
a = b
b = temp_a + 1

更多例子 https://golang.org/ref/spec#A...

a, b = b, a  // exchange a and b

x := []int{1, 2, 3}
i := 0
i, x[i] = 1, 2  // set i = 1, x[0] = 2

i = 0
x[i], i = 2, 1  // set x[0] = 2, i = 1

x[0], x[0] = 1, 2  // set x[0] = 1, then x[0] = 2 (so x[0] == 2 at end)

x[1], x[3] = 4, 5  // set x[1] = 4, then panic setting x[3] = 5.

type Point struct { x, y int }
var p *Point
x[2], p.x = 6, 7  // set x[2] = 6, then panic setting p.x = 7

i = 2
x = []int{3, 5, 7}
for i, x[i] = range x {  // set i, x[2] = 0, x[0]
    break
}
// after this loop, i == 0 and x == []int{3, 5, 3}
2017年1月26日 21:47
編輯回答
孤酒

規(guī)范要求賦值語(yǔ)句的右邊表達(dá)式先被求值.

所以

pre, pre_pre = tmp, pre

在求值后就是

// 假設(shè) tem = 3, pre = 2
pre, pre_pre = 3, 2
2018年8月30日 17:28