Одной из главных причин, по которой я решил продолжить свою карьеру, несмотря на то, что это удобно, в какой-то степени легко и…, была производительность. Go it self — это производительный язык. Но что, если мы можем даже сделать его более производительным при работе с JSON?

В наши дни большинство веб-сервисов работают со структурой данных Json для связи друг с другом. В каждом сервисе, приложении и… у вас в основном есть работа, связанная с JSON. Это часть бэкенда, которую нельзя игнорировать.

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

Примечание. Примеры кода в этой статье не предназначены для предприятий и являются всего лишь образцами.

Создание файлов JSON

В этой части я расскажу о создании JSON. В следующей части мы узнаем, как декодировать JSON из входящих запросов и делать их более производительными.

В GO мы используем пакет encoding/json для взаимодействия и работы с JSON. Этот пакет предоставляет две основные функции:

  1. Создать Json из структуры
  2. Преобразование JSON в структуру.

Самый обычный способ создания Json из структур, который мы, возможно, изучили, заключается в том, что сначала мы создаем структуру, а затем вызываем “Marshal” функцию encoding/json” пакета, then it will return slice of bytes ([]byte) of created json. Now we can pass it to output. (like: fmt.prinf())

type Response struct {
   Title  string `json:"title string"`
   Number int    `json:"number int"`
}
resp := Response{Title: "Mohammad", Age: 10}

jsonByte, _ := json.Marshal(resp)

fmt.Println(string(jsonByte))

Но ждать ! У меня есть для вас хорошие новости. У нас есть лучший способ генерировать JSON. Более эффективный способ с повышением производительности.

Вместо того, чтобы делать все это преобразование в срез байтов и передавать их на вывод, мы можем использовать функцию кодирования encoding/json” package. Как?

Сначала мы должны создать “encoder” with “NewEncoder” функцию encoding/json” пакета. Эта функция принимает один аргумент. Этот аргумент должен удовлетворять “io.Writer” интерфейсу. После этого мы просто вызываем функцию кодировщика “Encode” и просто передаем структуру. Он автоматически конвертирует данные в Json и печатает их на выходе.

type Response struct {
   Title  string `json:"title string"`
   Number int    `json:"number int"`
}
resp := Response{Title: "Mohammad", Age: 10}

jsonEncoder := json.NewEncoder(os.Stdout)

jsonEncoder.Encode(resp)

Этот способ еще более эффективен. Чтобы доказать это, я провел несколько эталонных тестов для обоих подходов. Результаты перечислены ниже:

BenchmarkMarshaling      3487369               361.9 ns/op
PASS
ok      test_service    1.920s

Это для использования устаревшего метода маршала.

BenchmarkEncoding      5792262               289.9 ns/op
PASS
ok      test_service    2.260s

И этот результат для случая, когда мы используем кодировщик.

Как видите, использование подхода encode почти в два раза быстрее, чем использование подхода marshaling.

В следующей части я расскажу о преобразовании JSON в структуру.

Спасибо, что прочитали мою статью.