将切片转换为数组指针

huangapple go评论82阅读模式
英文:

Conversion of slice to array pointer

问题

根据规范中的说明,将切片转换为数组指针会产生指向切片底层数组的指针。

s := make([]byte, 2, 4)
s0 := (*[0]byte)(s)      // s0 != nil

但是编译器报错:无法将类型为 []byte 的变量 s 转换为 *[0]byte

英文:

As mentioned in Spec, Converting a slice to an array pointer yields a pointer to the underlying array of the slice.

s := make([]byte, 2, 4)
s0 := (*[0]byte)(s)      // s0 != nil

But compiler gives error: cannot convert s (variable of type []byte) to *[0]byte

答案1

得分: 5

这个转换是在Go 1.17中添加到语言中的。

  • 语言的变化
    Go 1.17包含了三个小的语言增强。
  • 从切片到数组指针的转换:现在可以将类型为[]T的表达式s转换为数组指针类型*[N]T。如果a是这样一个转换的结果,那么对应的索引范围内的元素将引用相同的底层元素:对于0 <= i < N,&a[i] == &s[i]。如果len(s)小于N,则转换会引发恐慌。
  • [...]

这意味着您需要使用Go 1.17或更新版本才能使用这种转换。它在Go Playground上运行良好(目前Playground使用的是最新的Go 1.19)。

英文:

This conversion was added to the language in Go 1.17.

> ## Changes to the language
> Go 1.17 includes three small enhancements to the language.
> - Conversions from slice to array pointer: An expression s of type []T may now be converted to array pointer type *[N]T. If a is the result of such a conversion, then corresponding indices that are in range refer to the same underlying elements: &amp;a[i] == &amp;s[i] for 0 &lt;= i &lt; N. The conversion panics if len(s) is less than N.
> - [...]

This means you need Go 1.17 or newer to use such conversion. It works well on the Go Playground (currently the playground uses the latest Go 1.19).

huangapple
  • 本文由 发表于 2022年8月8日 02:33:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/73270054.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定