Какой вход вызовет golang json.Marshal, чтобы вернуть ошибку?
Из docs:
JSON не может представлять циклические структуры данных, и маршал не обрабатывает их. Передача циклических структур маршалу приведет к бесконечной рекурсии.
Я пережил эту ситуацию, которая приводит к панике в режиме выполнения.
Мне интересно, может ли кто-нибудь предоставить рабочую программу, которая демонстрирует непаническую ситуацию, когда json.Marshal возвращает ошибку, отличную от нуля. Наилучшие ответы на должны были включать в себя используемые входы.
Ответы
Ответ 1
Чтобы дополнить ответ Джонатана, функция json.Marshal может возвращать два типа ошибок: UnsupportedTypeError
или UnsupportedValueError
Первый может быть вызван, как сказал Джонатан, пытаясь маршалировать недопустимый тип:
_, err := json.Marshal(make(chan int))
_, ok := err.(*json.UnsupportedTypeError) // ok == true
С другой стороны, вы также можете вернуть функцию маршала, передав недопустимое значение:
_, err := json.Marshal(math.Inf(1))
_, ok := err.(*json.UnsupportedValueError) // ok == true
Ответ 2
Обновление: теперь используйте канал вместо карты [int] int, чтобы вызвать ошибку
Структуры, специфичные для Go, например. func
или chan
отказаться от сериализации:
package main
import (
"encoding/json"
"fmt"
)
func main() {
value := make(chan int)
_, err := json.Marshal(value)
fmt.Println(err)
}