>백엔드 개발 >Golang >UnmarshalJSON 내에서 json.Unmarshal을 호출할 때 스택 오버플로를 방지하는 방법은 무엇입니까?

UnmarshalJSON 내에서 json.Unmarshal을 호출할 때 스택 오버플로를 방지하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-25 19:18:16840검색

How to Avoid Stack Overflow When Calling `json.Unmarshal` Within `UnmarshalJSON`?

스택 오버플로를 유발하지 않고 UnmarshalJSON 내에서 json.Unmarshal 호출

문제:
UnmarshalJSON의 사용자 정의 구현 json.Unmarshal을 호출하면 스택이 발생할 수 있습니다.

해결책:

UnmarshalJSON 내에서 json.Unmarshal을 호출할 때 스택 오버플로 문제를 방지하려면 다음 기술을 활용하세요.

  1. type 키워드를 사용하여 새 유형을 생성하여 원본 위에 래퍼로 ​​만듭니다. type.
  2. 원래 값을 래퍼 유형의 인스턴스로 유형 변환합니다.
  3. 래퍼 유형 객체에 대해 json.Unmarshal을 호출하여 역정렬화를 수행합니다.
  4. 비마샬링 후 , 원본에 대해 사용자 정의 후처리를 수행합니다. type.

이론:

type 키워드를 사용하여 새 유형을 생성하면 원래 유형에서 모든 메소드가 효과적으로 제거됩니다. 마샬링 해제 프로세스 중에 래퍼 유형이 사용되면 JSON 디코더는 사용자 정의 UnmarshalJSON 구현을 찾지 않고 기본 구현을 사용합니다. 이렇게 하면 스택 오버플로 문제가 방지됩니다.

예:

Age 필드가 있는 Person 유형을 고려하세요.

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func (p *Person) UnmarshalJSON(data []byte) error {
    type personWrapper Person
    if err := json.Unmarshal(data, (*personWrapper)(p)); err != nil {
        return err
    }

    // Post-processing after unmarshaling:
    if p.Age < 0 {
        p.Age = 0
    }
    return nil
}

이 기술을 사용하면 사용자 정의가 가능합니다. 내에서 json.Unmarshal 호출과 관련된 스택 오버플로 문제를 피하면서 비정렬화 후 사후 처리 JSON을 비정렬화합니다.

위 내용은 UnmarshalJSON 내에서 json.Unmarshal을 호출할 때 스택 오버플로를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.