2017-05-16 68 views
-1

所以我是新來的你去與一般的編程經驗的公平,所以我希望我沒有得到的問愚蠢的問題再次downvoted。 我正在通過項目歐勒問題和問題25「千位數的斐波那契數字」我的方式我遇到了什麼似乎是奇怪的行爲。以下是我寫的導致此行爲的代碼。Golang:奇大詮釋行爲

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    index := 2 
    l := new(big.Int) 
    pl := big.NewInt(1) 
    i := big.NewInt(1) 
    for { 
     l = i 
     i.Add(i, pl) 
     pl = l 
     index++ 
     if len(i.String()) == 1000 { 
      break 
     } 
    } 
    fmt.Println(i, "\nindex: ", index) 
} 

當然,這並沒有產生正確的答案,從而確定爲什麼我發現我有過程無意間發現了一個巧妙的方法來生成2的冪。我做了以下修改,這確實產生正確的結果。

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    index := 2 
    l := new(big.Int) 
    pl := big.NewInt(1) 
    i := big.NewInt(1) 
    for { 
     l.Set(i) 
     i.Add(i, pl) 
     pl.Set(l) 
     index++ 
     if len(i.String()) == 1000 { 
      break 
     } 
    } 
    fmt.Println(i, "\nindex: ", index) 
} 

我的問題是,什麼是導致各大int變量設置爲我的價值,爲什麼沒有產生一個錯誤,如果這不是分配一個大的正確方法的第一個例子發生Int var值?是我= 1,等等一個合法的大型Int操作,這是不正確的這種情況?

回答

7

線條

l = i 

pl = l 

不是做你認爲他們是。

lpl,和i是指針,並將它們分配給彼此的副本的指針值,而不是big.Int值。

執行l = i後,l現在是相同的指針值作爲i,指向同一big.Int。當您使用l.Set(i)時,它將lbig.Int值設置爲ibig.Int值,但li仍指向兩個單獨的值。

+0

謝謝。這很有道理。 –