Как я могу использовать Go append с двумя [] байтовыми срезами или массивами? - PullRequest
26 голосов
/ 11 декабря 2011

Я недавно попытался добавить два байта массива в Go и столкнулся с некоторыми странными ошибками. Мой код:

one:=make([]byte, 2)
two:=make([]byte, 2)
one[0]=0x00
one[1]=0x01
two[0]=0x02
two[1]=0x03

log.Printf("%X", append(one[:], two[:]))

three:=[]byte{0, 1}
four:=[]byte{2, 3}

five:=append(three, four)

И ошибки:

cannot use four (type []uint8) as type uint8 in append
cannot use two[:] (type []uint8) as type uint8 in append

С учетом предполагаемой прочности ломтиков Го не должно быть проблем:

http://code.google.com/p/go-wiki/wiki/SliceTricks

Что я делаю не так, и как мне добавить два байтовых массива?

Ответы [ 2 ]

41 голосов
/ 11 декабря 2011

Спецификация языка программирования Go

Добавление и копирование фрагментов

Функция вариации append добавляет ноль или болеезначения от x до s типа S, который должен быть типом среза, и возвращает результирующий срез, также типа S.Значения x передаются параметру типа ...T, где T - тип элемента S, и применяются соответствующие правила передачи параметров.

append(s S, x ...T) S // T is the element type of S

Передача аргументов в ... параметров

Если последний аргумент присваивается типу среза []T, он может быть передан без изменений в качестве значения параметра ...T, если аргументсопровождается ....


Вам необходимо использовать []T... для последнего аргумента.

Для вашего примера, с типом фрагмента финального аргумента []byteза аргументом следует ...,

package main

import "fmt"

func main() {
    one := make([]byte, 2)
    two := make([]byte, 2)
    one[0] = 0x00
    one[1] = 0x01
    two[0] = 0x02
    two[1] = 0x03
    fmt.Println(append(one[:], two[:]...))

    three := []byte{0, 1}
    four := []byte{2, 3}
    five := append(three, four...)
    fmt.Println(five)
}

Детская площадка: https://play.golang.org/p/2jjXDc8_SWT

Вывод:

[0 1 2 3]
[0 1 2 3]
5 голосов
/ 11 декабря 2011

append() принимает срез типа []T, а затем переменное число значений типа элемента среза T. Другими словами, если вы передаете []uint8 в качестве среза append(), тогда каждый последующий аргумент будет uint8.

Решением этой проблемы является использование синтаксиса slice... для передачи фрагмента вместо аргумента varargs. Ваш код должен выглядеть как

log.Printf("%X", append(one[:], two[:]...))

и

five:=append(three, four...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...