Подтвердить что ты не робот

Как я могу использовать Go append с двумя [] байтами или массивами байтов?

Недавно я попробовал добавить два байтовых массива в 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

Учитывая, что предполагаемая устойчивость ломтиков Go не должна быть проблемой:

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

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

4b9b3361

Ответ 1

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

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

Функция variadic 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... для последнего аргумента.

Для вашего примера, с последним аргументом slice type []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]

Ответ 2

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

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

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

и

five:=append(three, four...)