从函数返回语句转到数组切片

The*_*chu 7 return go slice

我有以下功能:

func (c *Class)A()[4]byte
func B(x []byte)
Run Code Online (Sandbox Code Playgroud)

我想打电话

B(c.A()[:])
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

cannot take the address of c.(*Class).A()
Run Code Online (Sandbox Code Playgroud)

如何正确获取Go中函数返回的数组?

pet*_*rSO 9

的价值c.A(),从方法的返回值,不能寻址.

地址运营商

对于类型为T的操作数x,地址操作&x生成类型为*T到x的指针.操作数必须是可寻址的,即,变量,指针间接或切片索引操作; 或可寻址结构操作数的字段选择器; 或者可寻址数组的数组索引操作.作为可寻址性要求的例外,x也可以是复合文字.

如果切片操作数是字符串或切片,则切片操作的结果是相同类型的字符串或切片.如果切片操作数是数组,则它必须是可寻址的,并且切片操作的结果是具有与数组相同的元素类型的切片.

使c.A()数组的值可以为切片操作寻址[:].例如,将值赋给变量; 变量是可寻址的.

例如,

package main

import "fmt"

type Class struct{}

func (c *Class) A() [4]byte { return [4]byte{0, 1, 2, 3} }

func B(x []byte) { fmt.Println("x", x) }

func main() {
    var c Class
    // B(c.A()[:]) // cannot take the address of c.A()
    xa := c.A()
    B(xa[:])
}
Run Code Online (Sandbox Code Playgroud)

输出:

x [0 1 2 3]
Run Code Online (Sandbox Code Playgroud)