将切片转换为固定大小数组
通常会遇到需要将切片转换为固定大小数组的情况。在 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中文网其他相关文章!