將切片轉換為固定大小數組
通常會遇到需要將切片轉換為固定大小數組的情況。在 Go 中,切片是可以增長和收縮的動態資料結構,而陣列是固定大小的,必須使用特定大小進行初始化。
考慮以下程式碼:
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // Error: Cannot assign slice to array } } }
在此在程式碼中,我們嘗試將名為bricks的切片轉換為固定大小的陣列b。但是,這會導致錯誤,因為切片和陣列具有不同的類型。
使用副本
要將切片轉換為固定大小的數組,可以使用副本功能。複製函數將元素從一個切片或陣列複製到另一個切片或陣列。它需要兩個參數:目標切片或陣列以及來源切片或陣列。
以下範例示範如何使用複製將切片轉換為陣列:
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr)
在此例如,copy 函數將切片的前四個位元組複製到 arr 陣列。產生的陣列將包含值 [97 98 99 100]。
使用切片到數組的轉換(Go 1.17 )
在Go 版本1.17 及更高版本中,引入了一項新功能來支援切片到數組的轉換。這允許您直接將切片指派給數組指針,而無需使用複製函數。
以下範例示範了切片到陣列轉換的使用:
s := make([]byte, 2, 4) s0 := (*[0]byte)(s) // s0 != nil s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] s2 := (*[2]byte)(s) // &s2[0] == &s[0] // s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
在此範例中,我們建立一個切片s,然後用它來初始化三個陣列指標:s0、s1和s2。 s0 是指向零長度數組的指針,s1 是指向包含一個元素的數組的指針,s2 是指向包含兩個元素的數組的指針。
請注意,此功能僅適用於以下切片:由底層陣列支援。如果切片沒有數組支持,您仍然需要使用複製函數將其轉換為數組。
以上是如何將 Go 切片轉換為固定大小的陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!