>  기사  >  백엔드 개발  >  UnmarshalJSON 함수 내에서 json.Unmarshal을 호출해도 스택 오버플로가 발생하지 않습니다.

UnmarshalJSON 함수 내에서 json.Unmarshal을 호출해도 스택 오버플로가 발생하지 않습니다.

WBOY
WBOY앞으로
2024-02-12 08:27:09576검색

在 UnmarshalJSON 函数内调用 json.Unmarshal 不会导致堆栈溢出

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 키워드가 새 유형을 생성하고 새 유형에 메서드가 없기 때문에 작동합니다(기본 유형의 메서드를 "상속"하지 않음).

이로 인해 런타임 오버헤드가 발생합니까? 아니요. 사양에서 인용: 변환:

예를 들어보겠습니다. 숫자가 있는 것이 하나 있습니다 AgePerson 类型,并且我们要确保 Age 不能为负数(小于 0).

으아악

테스트해 보세요:

으아악

출력(Go Playground에서 사용해 보세요):

으아악

물론, 동일한 기술이 사용자 정의 마샬에도 적용됩니다(MarshalJSON()):

으아악

테스트해 보세요:

으아악

출력(동일한 Go Playground 예에서):

으아악

매우 유사한 문제는 a> 패키지에 fmt 的自定义文本表示定义 String() string 메서드를 사용하고 수정한 기본 문자열 표현을 사용하려는 경우입니다. 자세한 내용은 여기를 참조하세요. t와 *t

의 차이점

위 내용은 UnmarshalJSON 함수 내에서 json.Unmarshal을 호출해도 스택 오버플로가 발생하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제