Какой вход вызовет 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)
}