Golang. Что работает быстрее strings.Contains или json.Unmarshal?
Здравствуйте! У меня есть клиент, который отправляет запросы к api и возвращает "сырой" (просто текст) ответ. Ответы от api приходят в виде json. Иногда api может возвращать ошибку, условно говоря, в таком виде {"error_code": 1, "error_msg": "some error"}. Клиент должен понять, что вернулась ошибка и перенаправить ответ от api в канал для ошибок.
Очевидное решение сделать в клиенте json.Unmarshal и проверить существование поля error_code, но, насколько я понимаю, это не самая легкая операция, тем более что ответы от api могут содержать очень длинные json'ы.
Что если искать вхождение error_code в тексте с помощью strings.Contains и только если оно найдено, тогда делать json.Unmarshal. Поможет ли это повысить производительность?
А если ответ будет {"message":"error_code"}, то strings.Contains сломается.
В этом случае я сделаю json.Unmashal и проверю, что поле действительно существует.
И вообще, как часто случаются ошибки? Что происходит, если нет ошибки? Если всё-равно тот же json.Unmarshal, то непонятно что мы тут особо сэкономим…
Действительно, что json.Unmarshal придется делать в любом случае, но я не хочу, чтобы это происходило в клиенте. От клиента мне надо чтобы он просто умел асинхронно отправлять запросы к апи и передавать всё что получил в канал результатов или в канал ошибок. А дальше уж бизнес логика сама решит в какую структуру преобразовать ответ.
Производительность это повысит, strings.Contains работает гораздо быстрее, чем json.Unmarshal
Но надежность понизит, ибо error_code будет искаться везде, это не обязательно будет имя поля.
Спасибо! По поводу надежности, тут смысл в том, чтобы не проверять существование поля, в случаях, когда в тексте нет вхождения error_code (а это большинство случаев). Если же в тексте есть error_code, то тогда уже делаем полноценную проверку существования поля.
Согласен с Александр Павлюк .
Если хочется сэкономить на случаях, когда ответ достаточно увесистый, а достаточно лишь получить некоторые поля, тогда можно попробовать https://github.com/tidwall/gjson