2017-08-24 23 views
-2

我是一個總golang(1.8)n00b試圖快速索引數組的一部分。這是我的嘗試:索引數組的一部分

8: data := make([]byte, 10) 
9: row := &data[3] 
10: fmt.Println(row[0]) 

生成錯誤是:(?互斥)

10: invalid operation: row[0] (type *byte does not support indexing) 

金星,如果你也知道,如果有任何並行原語訪問data陣列時,這可能減緩寫下來,而不是讓每個goroutine分配一個自己的數組。

+1

錯誤信息的哪一部分不清楚?如果你認爲自己是n00b,爲什麼你對「平行原語」感興趣? – Volker

+1

歡迎使用Go!不知道你試圖做什麼。 (8)'data'是一個可以存儲10個字節的分片。 (9)將第4個字節的指針複製到變量'row'中。 ..但是,然後你嘗試訪問一個指針的第一個值?這是不允許的。不像C,你不能做指針算術。那是你想做什麼? – ANisus

+0

@ANisus:所以沒有辦法使用指向數組的一部分的指針進行優化? * Volker:*我不是n00b,只是一個n00b。 –

回答

1

首先,我建議閱讀本Go blog post澄清陣列之間的差異。

簡單地說:

  • 陣列是元素的編號序列。
  • 切片包含指向底層數組元素的指針,長度和容量。

你通常對像C這樣的語言的指針算術做什麼,你在Go中使用切片。實際上,你很少在Go中直接使用數組。

切片

在你的榜樣,你可以做到以下幾點:

data := make([]byte, 10) // Create a slice with length of 10 
row := data[3:]   // Slicing a new slice starting from index 3. Length is 6 
row[0] = 42 
fmt.Println(data[3]) 

輸出:

使用切片,可將不同的Go例程的不同部分傳遞給不同的Go例程,無需任何比賽。

但是,如果您想讓它們在同一片上工作,您可以始終使用sync.Mutex來保護它。