Как преобразовать любой тип данных в байт в Go - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь создать для l oop, который преобразует любой тип данных в массив байтов ... это то, что у меня есть прямо сейчас

var arrByte [][]byte
    for _,v := range *arr.(*[]interface{}) {
        string := fmt.Sprint(v)   // What can I put here so that I dont have to convert to string
        arrByte = append(arrByte, []byte(string))
    }

Проблема с этим кодом в том, что Я не могу преобразовать его обратно в его типы данных. Итак, как я могу напрямую изменить его, чтобы он сохранял правильное форматирование, чтобы я мог позже запустить это?

var arrInterface []interface{}

    for _,v := range arrByte {
        data := binary.BigEndian.Uint64(v)
        arrInterface = append(arrInterface, data)
    }

1 Ответ

2 голосов
/ 11 июля 2020

Во-первых, замечание по терминологии: похоже, вы говорите о байтовых срезах , а не о байтовых массивах. Массивы в Go имеют фиксированную длину, поэтому вызов append для них не сработает. Подробнее см. здесь .

Теперь к вашему вопросу ...

Я пытаюсь создать для l oop, который преобразует любой тип данных в байтовый массив ...

Это невозможно, за исключением самого поверхностного, бессмысленного смысла. Например, если у вас есть переменная типа net.Conn, преобразование ее в байты даст вам бессмысленное значение, поскольку оно имеет смысл только в сочетании с одним конкретным c, активным сетевым подключением.

Однако , предполагая, что у вас нет переменных, которые относятся к эфемерному состоянию, как это, самый простой способ преобразовать произвольные переменные в байтовый срез - это что-то вроде gob encoding .

Однако это также имеет ограничения в том, что при сериализации структур он может получить доступ только к экспортированным полям или к тем, которые отображаются через интерфейс GobEncoder . В этом разделе вопросов и ответов объясняется, почему существует это ограничение .

Теперь, в некоторых случаях вы можете обойти это ограничение, например, с помощью отражения, но это очень обременительно и обычно неразумно, поскольку Неэкспортированные поля часто ссылаются на эфемерное состояние (см. примечание выше).

Итак, в итоге: невозможно осмысленно сделать это для всех типов данных. Это сложно сделать для многих типов данных, и тривиально сделать это для «обычных» типов данных.

...