Squeak.ru - шаблоны программирования

Как кодировать/декодировать пустую строку

Я использую кодировку GOB для своего проекта и понял (после долгой борьбы), что пустые строки кодируются/декодируются неправильно. В моем коде я использую сообщение об ошибке (строку), чтобы сообщить о любых проблемах, это сообщение об ошибке большую часть времени пусто. Если я кодирую пустую строку, она становится ничем, и у меня возникают проблемы с декодированием. Я не хочу менять кодирование/декодирование, потому что эти части используются чаще всего. Как я могу сказать Go, как кодировать/декодировать пустые строки?

Пример: рабочий код Playground. Playground не работает код.


  • Глядя на пример, проблема заключается в ваших пользовательских методах MarshalBinary/UnmarshalBinary, а не в gob. Если вы экспортируете поля в структуру (сделайте их в верхнем регистре) и просто используете сортировку по умолчанию, ваш пример работает. 04.12.2014
  • @James Henstridge Спасибо, все работает безупречно. Опубликуйте ответ, чтобы я мог отметить вас как ответ. Кстати, кто-то должен обновить документацию, потому что я не мог понять, что поля в верхнем регистре решат другую проблему, с которой я сначала столкнулся. 04.12.2014

Ответы:


1

Проблема заключается не в модуле encoding/gob, а в пользовательских методах MarshalBinary/UnmarshalBinary, которые вы объявили для Msg, которые не могут правильно обработать пустую строку. Здесь можно пойти двумя путями:

  1. Избавьтесь от методов MarshalBinary/UnmarshalBinary и полагайтесь на кодировку GOB по умолчанию для структур. Одного этого изменения будет недостаточно, потому что поля структуры не экспортируются. Если вы готовы экспортировать поля, это самый простой вариант: https://play.golang.org/p/rwzxTtaIh2

  2. Используйте кодировку, которая может корректно передавать пустые строки в оба конца. Одним из простых вариантов было бы использовать сам GOB для кодирования полей структуры:

    func (m Msg) MarshalBinary() ([]byte, error) {
        var b bytes.Buffer
        enc := gob.NewEncoder(&b)
        if err := enc.Encode(m.x); err != nil {
            return nil, err
        }
        if err := enc.Encode(m.y); err != nil {
            return nil, err
        }
        if err := enc.Encode(m.z); err != nil {
            return nil, err
        }
        return b.Bytes(), nil
    }
    
    // UnmarshalBinary modifies the receiver so it must take a pointer receiver.
    func (m *Msg) UnmarshalBinary(data []byte) error {
        dec := gob.NewDecoder(bytes.NewBuffer(data))
        if err := dec.Decode(&m.x); err != nil {
            return err
        }
        if err := dec.Decode(&m.y); err != nil {
            return err
        }
        return dec.Decode(&m.z)
    }
    

    Вы можете поэкспериментировать с этим примером здесь: https://play.golang.org/p/oNXgt88FtK

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

04.12.2014
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

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

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...