英文:
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: &a[i] == &s[i] for 0 <= i < 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).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论