Перейти фрагмент массива из оператора возврата функции - PullRequest
7 голосов
/ 30 ноября 2011

У меня есть следующие функции:

func (c *Class)A()[4]byte
func B(x []byte)

Я хочу позвонить

B(c.A()[:])

, но я получаю эту ошибку:

cannot take the address of c.(*Class).A()

Как мне правильнополучить фрагмент массива, возвращенный функцией в Go?

Ответы [ 2 ]

9 голосов
/ 30 ноября 2011

Значение c.A(), возвращаемое из метода, не адресуется.

Операторы адреса

Для операнда x типаT, адресная операция & 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[:])
}

Вывод:

x [0 1 2 3]
2 голосов
/ 30 ноября 2011

Пытались ли вы сначала поместить массив в локальную переменную?

ary := c.A()
B(ary[:])
...