Работа с Golang иногда может быть болезненной, особенно если вы новичок и еще не цените его красоту. Тривиальная задача, такая как обработка объекта ответа JSON — которая в JS намного проще, до такой степени, что вам даже не нужно заботиться об использовании переменных для хранения этих значений — в Golang становится слишком сложной. .

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

JSON — это самые популярные универсальные стандарты, определенные для передачи текстовой информации через инструменты, интерфейсы и службы на базе SaaS. Сегодня он имеет встроенную поддержку во всех основных языках программирования — возможно, за исключением Golang.

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

Это шутка, и я говорю это с чувством признательности. Слишком легко получить доступ к атрибутам или перебрать объект JSON для обработки. Давайте рассмотрим простой объект JSON, который выглядит, как показано ниже.

{
  "name": "value",
  "env" : "production"
}

Мы можем просто получить доступ к значениям имени и окружения, выполнив следующее:

var jsonObj = <object above>
console.log(jsonObj.name)
console.log(jsonObj.env)

Это экономит много времени на разработку.

Аналогично, даже в Golang вам необходимо знать структуру объекта JSON перед запуском исполняемого файла. Мы воспользуемся этим, чтобы явно определить структуру обрабатываемого объекта JSON. В этом смысле Golang немного ортодоксален. Чтобы обработать объект JSON, указанный выше, мы сначала определяем структуру, как показано ниже.

type JSONObj struct {
  Name string `json:"name"`
  Env  string `json:"env"`
}

Приведенный выше блок кода просто определяет структуру в Golang для обработки соответствующего экземпляра объекта JSON. Как мы видим, мы явно определяем тип (как строку) для каждого атрибута, который будет обрабатываться функциями. Кроме того, `json:"name"` и `json:"env"` сообщают компилятору, что входящий объект JSON будет иметь атрибуты (ключи) с этими значениями.

Кроме того, для фактического доступа к этим значениям входящий объект JSON — назовем его ответом — должен быть Unmarshalled в эту структуру, и наоборот — Marshalled должен быть преобразован обратно в байтовый формат, если его необходимо вернуть. Чтобы сделать то же самое, нам нужно использовать модуль json Golang, как показано ниже.

// Assuming we get this response in response.Body
response, err := ioutil.ReadAll(response.Body)
var jsonResp JSONObj
err := json.Unmarshall(response, &jsonResp)

// Access the attributes now -
fmt.println(jsonResp.name, jsonResp.env)

Кажется, здесь много всего происходит. Но, как я уже говорил, доверяйте процессу. Именно эта строго типизированная природа Golang делает его более производительным, чем JS.

Думайте об этом как о существенном преобразовании входящего объекта JSON, чтобы его можно было нормально обрабатывать в среде Golang. Для конкретного понимания синтаксиса Golang, описанного выше, если вы не знакомы, я предлагаю вам просмотреть документацию или просто использовать ChatGPT. ;)

Да, вы правильно догадались — в Голанге дела обстоят еще хуже. В тех случаях, когда у нас есть многовложенные объекты JSON и чтобы код был читабельным, мы используем несколько структур. Рассмотрим вложенный пример JSON ниже.

{
  "name": "John Doe",
  "age": 30,
  "contact": {
    "email": "[email protected]",
    "phone": "123-456-7890"
  },
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "zipcode": "10001",
    "country": "USA"
  }
}

Чтобы получить и обработать такой ответ JSON, необходимо создать приведенные ниже структуры, прежде чем мы сможем Unmarshall или Marshall сделать то же самое.

type Person struct {
 Name    string  `json:"name"`
 Age     int     `json:"age"`
 Contact Contact `json:"contact"`
 Address Address `json:"address"`
}

type Contact struct {
 Email string `json:"email"`
 Phone string `json:"phone"`
}

type Address struct {
 Street  string `json:"street"`
 City    string `json:"city"`
 Zipcode string `json:"zipcode"`
 Country string `json:"country"`
}

Обратите внимание, как структуры для вложенных JSON — Address и Contact — создаются, а затем используются в «родительской» структуре с именем Person. Аналогичная картина наблюдается, если у нас есть 3-уровневый, 4-уровневый и т. д. уровень вложенного JSON.

Прежде чем мы поговорим о ChatGPT, возможно, вы думаете об этом, если вы еще не являетесь разработчиком Golang. Это не значит, что ChatGPT должен быть причиной выбора этого языка. У Golang есть свои преимущества, которые намного перевешивают этот общий трюк.

Глядя на разницу выше, интересно ли вам изучать Golang или продолжать заниматься тем, чем занимаетесь?

Без сомнения, написание кода на Golang — утомительное занятие. Но если вы спросите любого облачного архитектора, обеспокоенного затратами на вычисления, он в любой момент предпочтет Golang.

Теперь сразу к делу: поскольку мы уже знаем, какой JSON будет обрабатываться, мы можем просто попросить ChatGPT сгенерировать соответствующие структуры, и он сделает это за секунды — идеально с нотациями `json:”‹attribute_name›”`. .

Мне бесстыдно это говорить, потому что:

  1. Мы не можем игнорировать реальность ChatGPT. Когда космические путешествия стали доступными, зачем вам покупать отпуск на Гавайях?
  2. Ввод структур вручную — действительно утомительный и медленный процесс, подверженный человеческим ошибкам, что замедляет разработку.

Это был совет с некоторым пониманием и опытом работы с Голангом. Я настоятельно рекомендую всем веб-разработчикам изучить Golang по всем правильным причинам. Я ни в коем случае не имел в виду, что другие языки плохи, у каждого языка есть свои преимущества.

Сумит Н.

Первоначально опубликовано на https://blog.letsdote.ch.