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

В наши дни большинство веб-сервисов работают со структурой данных Json для связи друг с другом. В каждом сервисе, приложении и… у вас в основном есть работа, связанная с JSON. Это часть бэкенда, которую нельзя игнорировать.
Итак, как мы можем улучшить производительность нашего приложения, когда дело доходит до работы с JSON? Пойдем дальше.
Примечание. Примеры кода в этой статье не предназначены для предприятий и являются всего лишь образцами.
Создание файлов JSON
В этой части я расскажу о создании JSON. В следующей части мы узнаем, как декодировать JSON из входящих запросов и делать их более производительными.
В GO мы используем пакет “encoding/json“ для взаимодействия и работы с JSON. Этот пакет предоставляет две основные функции:
- Создать Json из структуры
- Преобразование 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 в структуру.
Спасибо, что прочитали мою статью.