XML, CSV и base64
Зачем это на интервью
Не каждый интеграционный формат — JSON. Нужны точные границы: CSV — табличный текст, XML — структурированный документ, base64 — кодирование байтов, а не шифрование и не сжатие.
Минимум для E4
- Читать CSV через
encoding/csv, а неstrings.Split. - Описывать XML struct tags и обрабатывать ошибки decode.
- Уметь кодировать/декодировать base64 и понимать увеличение размера.
Углубление для E5/Senior
Для больших XML/CSV применяйте streaming API, лимиты reader и контекст на уровне транспорта, а не загружайте весь файл без причины. CSV не имеет единой схемы: явно задайте delimiter, заголовки, число полей и правила пустых/невалидных значений. XML может содержать большие и глубоко вложенные документы; ограничивайте вход, валидируйте доменные поля и не принимайте «успешный parse» за безопасность. Base64 увеличивает размер примерно на треть и не обеспечивает ни конфиденциальности, ни целостности.
Ключевые понятия
// CSV: Reader корректно учитывает кавычки и экранирование.
r := csv.NewReader(input)
r.FieldsPerRecord = 3
for {
record, err := r.Read()
if errors.Is(err, io.EOF) { break }
if err != nil { return err }
_ = record
}
type Invoice struct { ID string `xml:"id,attr"`; Total int `xml:"total"` }
var inv Invoice
if err := xml.NewDecoder(xmlInput).Decode(&inv); err != nil { return err }
encoded := base64.StdEncoding.EncodeToString([]byte("binary\x00data"))
raw, err := base64.StdEncoding.DecodeString(encoded)Для потоковой base64-кодировки используйте base64.NewEncoder, закрывая writer, чтобы дописать padding. Для CSV-записи завершайте Flush и проверяйте w.Error().
Типовые вопросы
- Почему CSV нельзя разбирать
Split(",")?- Поле может содержать запятую, кавычки и перевод строки по правилам CSV.
- Шифрует ли base64 данные?
- Нет, это обратимое текстовое представление байтов.
- Как обработать большой CSV?
- Читать запись за записью через
Reader, неReadAll, с лимитами входа.
- Читать запись за записью через
- Чем XML tag отличается от JSON tag?
- XML описывает элементы, атрибуты и вложенность; формат tag другой.
- Почему после
csv.Writer.FlushнужнаError?- Ошибка записи может возникнуть асинхронно во время flush.
Практика
- Импортируйте CSV из
io.Reader. Готово: корректно обрабатываются quoted comma, неверное число колонок и I/O error. - Реализуйте streaming base64-кодирование файла. Готово: decode даёт исходные байты, encoder закрывается, тест не читает файл целиком.
Частые ошибки и ловушки
- Считать base64 защитой секрета.
- Не ограничивать размер загружаемого XML/CSV.
- Игнорировать
csv.Writer.Error().
Связанные темы
Коллекции и работа с данными · JSON