JSON 데이터를 처리할 때 일반적으로 json.Unmarshal 함수를 사용하여 JSON 문자열을 Go 언어의 구조로 구문 분석합니다. 그러나 UnmarshalJSON 함수 내에서 json.Unmarshal 함수를 호출하면 스택 오버플로 오류가 발생할 수 있습니다. 이는 JSON 데이터를 구문 분석할 때 UnmarshalJSON 함수가 자신을 다시 호출하여 무한 루프가 발생하기 때문입니다. 이를 방지하려면 json.Unmarshal 함수를 직접 호출하는 대신 json.Decoder의 Decode 메서드를 사용하여 JSON 데이터를 구문 분석할 수 있습니다. 이렇게 하면 스택 오버플로 문제가 발생하지 않고 코드의 견고성과 성능이 보장됩니다.
구현을 초기화하기 위해 몇 가지 추가 단계를 수행하고 싶고 UnmarshalJSON
中的数据结构。在该实现中调用 json.Unmarshal(b, type)
이로 인해 자연스럽게 스택 오버플로가 발생합니다.
JSON 디코더는 사용자 정의가 있는지 계속해서 찾으려고 합니다 UnmarshalJSON
实现,然后再次调用 json.Unmarshal
.
다른 방법이 있나요? 기본 기본 구현을 호출하는 것만으로도 이 문제가 발생하지 않습니까?
이를 방지/방지하는 간단하고 일반적인 방법은 type
키워드를 사용하고 conversion 유형을 사용하여 해당 유형의 값을 전달하는 것입니다. 새 유형이 기본 유형을 기본 유형으로 갖기 때문에 변환이 가능합니다.
이것은 type
키워드가 새 유형을 생성하고 새 유형에 메서드가 없기 때문에 작동합니다(기본 유형의 메서드를 "상속"하지 않음).
이로 인해 런타임 오버헤드가 발생합니까? 아니요. 사양에서 인용: 변환:
예를 들어보겠습니다. 숫자가 있는 것이 하나 있습니다 Age
的 Person
类型,并且我们要确保 Age
不能为负数(小于 0
).
테스트해 보세요:
으아악출력(Go Playground에서 사용해 보세요):
으아악물론, 동일한 기술이 사용자 정의 마샬에도 적용됩니다(MarshalJSON()
):
테스트해 보세요:
으아악출력(동일한 Go Playground 예에서):
으아악매우 유사한 문제는 a> 패키지에 fmt
的自定义文本表示定义 String() string
메서드를 사용하고 수정한 기본 문자열 표현을 사용하려는 경우입니다. 자세한 내용은 여기를 참조하세요. t와 *t
위 내용은 UnmarshalJSON 함수 내에서 json.Unmarshal을 호출해도 스택 오버플로가 발생하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!