首页 >后端开发 >Golang >如何将 Go 切片转换为固定大小的数组?

如何将 Go 切片转换为固定大小的数组?

Susan Sarandon
Susan Sarandon原创
2024-11-19 01:06:021026浏览

How do I convert a Go slice to a fixed-size array?

将切片转换为固定大小数组

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn