2013-09-29 61 views
21

我是Go新手,嘗試編寫讀取RPM文件的應用程序。每個塊的開始處有一個魔術字符[4]byte在Golang中如何將切片轉換爲數組

這裏是我的結構

type Lead struct { 
    Magic  [4]byte 
    Major, Minor byte 
    Type   uint16 
    Arch   uint16 
    Name   string 
    OS   uint16 
    SigType  uint16 
} 

我努力做到以下幾點:

lead := Lead{} 
lead.Magic = buffer[0:4] 

我在尋找在線和不知道如何從中分得一杯羹到一個數組(不復制) 。我總是可以製作魔術[]byte(或者甚至是uint64),但是我更加好奇,如果需要,我將如何從[]byte[4]byte

+1

最近有關於是否應該允許切片到數組中的爭論。結果是不確定的,像你想要的東西可能會在未來添加。請記住,[4]字節是一個對象,而不是指向對象的指針。唯一可能的是分配給一個指向數組的指針。 – fuz

+0

https://play.golang.org/p/ulk0kmJzf6 –

回答

27

的方法複製只會不是一個切片的切片複製到切片到一個數組內置。

您必須誘騙副本以爲數組是一個片段

copy(varLead.Magic[:], someSlice[0:4]) 

或者使用一個for循環做副本:

for index, b := range someSlice { 

    varLead.Magic[index] = b 

} 

還是做的祖帕已經用文字來完成。我已經加入他們的工作示例。

Go Playground

+1

做[0:3]只會複製前3個元素,而不是全部4個。如其他建議,[0:4] – galaktor

+1

您也可以使用'copy(varLead.Magic [:],someSlice [:])'。這將複製適合數組的所有內容。 – Pascal

+2

好吧,'copy(varLead.Magic [:],someSlice)'就足夠了,因爲它只會複製適合數組的內容。 – shebaw

10

您已經在該結構中分配了四個字節,並且希望爲該四字節部分分配一個值。沒有複製的概念性的方式。

看看內置的copy如何做到這一點。

6

試試這個:

copy(lead.Magic[:], buf[0:4]) 
-4

不要。切片本身就足夠了所有目的。 go lang中的數組應該被視爲切片的底層結構。在每一種情況下,只使用切片。你不必排列自己。你只是通過片語法來做所有事情。陣列僅適用於電腦。在大多數情況下,切片更好,代碼清晰。即使在其他情況下,切片仍然足以反映您的想法。

+1

In * general *切片可能優於數組,但有些地方數組適合且優越。說「在每一個案例中,只使用切片」是錯誤的。 –

+2

需要數組的地方的一個例子:作爲一個必須具有可比性的結構的成員(例如,將它用作地圖鍵)。 –

0

你可以用一次閱讀完成整個事情,而不是單獨閱讀每個字段。如果這些字段是固定長度的,那麼你可以這樣做:

lead := Lead{} 

// make a reader to dispense bytes so you don't have to keep track of where you are in buffer 
reader := bytes.NewReader(buffer) 

// read into each field in Lead, so Magic becomes buffer[0:4], 
// Major becomes buffer[5], Minor is buffer[6], and so on... 
binary.Read(reader, binary.LittleEndian, &lead)