2017-07-18 26 views
0

的片段:傳遞切片SCANF

package main 
import "fmt" 

func main() { 
    mapIsh := make([]int64, 5) 
    fmt.Scanf("%v %v %v %v %v", &mapIsh[0], &mapIsh[1], &mapIsh[2], &mapIsh[3], &mapIsh[4]) 

    fmt.Print(mapIsh[0], mapIsh[1], mapIsh[2], mapIsh[3], mapIsh[4]) 
} 

我箱子片,並要保存讀操作的內容。以上工作如預期。我沒有得到的是爲什麼我必須傳遞指向數組元素的指針(我認爲值是通過片/數組的引用傳遞的)。

此外,如果我不做一個參數指針後續的值不會被讀取。所以有人可以解釋如下:

輸入數據:1 2 3 4 5

1)爲:

fmt.Scanf("%v %v %v %v %v", mapIsh[0], mapIsh[1], mapIsh[2], mapIsh[3], mapIsh[4]) 

我得到:0 0 0 0 0

2)爲:

fmt.Scanf("%v %v %v %v %v", &mapIsh[0], &mapIsh[1], mapIsh[2], &mapIsh[3], &mapIsh[4]) 

我得到:1 2 0 0 0

+1

添加錯誤檢查。在某些情況下,您的示例會產生錯誤「預期的整數」 –

+1

另外,我已經爲格式化字符串添加了'\ n',並且錯誤消失了。 –

回答

1

首先,值爲而不是通過切片/數組的參考傳遞。

同時,如果您將切片值傳遞給某個函數,接收器將能夠修改相同的基礎數組,因爲切片值包含一個指針。

對於您的情況,您並未傳遞片段本身,而是取消引用的int64值的副本。並且fmt.Scanf未更新mapIsh。只有通過地址才能使用掃描值。

+0

Tnx。這就說得通了。我想我是一個例子,其中一個int通過引用傳遞給scanf –

2

參數總是按Go中的值傳遞,絕不參考。

你說的正確,將一個切片傳遞給一個函數將允許該函數改變其元素。但是你沒有通過Scanf;你的兩個例子傳入了int64元素而不是傳入這些元素的地址。我認爲你會被索引語法弄糊塗,並認爲mapIsh[0]在某種程度上意味着你傳遞了一些函數將會發生變異的東西。但mapIsh[0]真的只是一個int64,mapIsh的第一個元素。

至於你爲什麼要得到零,那是因爲Go初始化mapIsh爲zero-value,對於int64s數組全爲0。當Scanf無法讀入您忘記&的值時,無法繼續。這就是爲什麼你應該檢查從Scanf返回的錯誤,這將表明錯誤。 (請注意,傳遞值意味着將數組傳遞給函數會創建該數組的副本,因此該函數將無法像切片一樣對元素進行變異,但實際上並不是這樣如上所述。)

+0

感謝,我間隔和添加「或數組」沒有思考。現在修復,並在最後添加註釋。 –

+0

太棒了,我已經刪除了我的評論現在毫無意義。 –