切片数组文字

AJR*_*AJR 0 arrays go slice

我认为 Go 规范存在一个小问题。以下抱怨数组文字不可寻址:

    print([4]int{2,3}[:2])
Run Code Online (Sandbox Code Playgroud)

我知道为什么从函数返回的数组不可寻址(例如,对函数返回的切片进行寻址时出错),但为什么数组文字像[4]int{2,3}不可寻址一样?特别是当切片和字符串文字是 - 例如这些工作正常:

    print([]int{2,3,0,0}[:2])
    print("2300"[:2])
Run Code Online (Sandbox Code Playgroud)

此外,数组文字似乎是可寻址的,因为它&[4]int{42,43}是一个有效的表达式。

我知道我可以用切片

    print([]int{2,3,0,0}[:2])
Run Code Online (Sandbox Code Playgroud)

但是如果我希望容量(数组长度)是一个编译时常量呢?

    const maxLength = 4
    ...
    print([maxLength]int{2,3}[:2])
Run Code Online (Sandbox Code Playgroud)

是的,我可以分配给一个临时数组变量,但为什么我需要?

Cer*_*món 6

使用以下内容:

fmt.Println((&[4]int{2, 3})[:2])
Run Code Online (Sandbox Code Playgroud)

规范是关于切片表达式的

如果切片操作数是一个数组,它必须是可寻址的。

此有关的寻址能力

操作数必须是可寻址的,即变量、指针间接或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。作为可寻址性要求的一个例外,x 也可以是(可能带括号的)复合文字。

该数组不可寻址,但可以使用复合文字异常来获取可寻址值。

数组操作数必须是可寻址的,因为结果切片的元素是可寻址的。字符串操作数不需要可寻址,因为字符串元素永远不可寻址。