> 백엔드 개발 > Golang > Go에서 `map[string]string`을 마샬링할 때 `json.Marshal`이 언제 실패합니까?

Go에서 `map[string]string`을 마샬링할 때 `json.Marshal`이 언제 실패합니까?

Susan Sarandon
풀어 주다: 2024-11-30 09:11:13
원래의
236명이 탐색했습니다.

When Does `json.Marshal` Fail When Marshaling a `map[string]string` in Go?

map[string]string을 JSON으로 마샬링: 언제 오류를 반환할 수 있나요?

다음 코드 조각을 고려하세요.

m := map[string]string{}
//... do stuff to the map
b, err := json.Marshal(m)
로그인 후 복사

일반적으로 map[string]string을 JSON으로 마샬링하면 오류가 반환되지 않습니다. JSON은 문자열을 키와 값으로 지원하며 Go는 문자열 값을 UTF-8 바이트 시퀀스로 인코딩합니다. 유효하지 않은 UTF-8 문자도 유니코드 대체 문자로 대체됩니다.

m := map[string]string{"\xff": "a"}
data, err := json.Marshal(m)
// Output: {"\ufffd":"a"} <nil>
로그인 후 복사

그러나 문서에 오류가 일반적으로 nil이라고 명시되어 있더라도 반환된 오류를 항상 확인해야 한다는 점에 유의하는 것이 중요합니다.

map[string]string이 json.Marshal()에 동시에 전달되면 더 모호한 잠재적인 문제가 발생합니다. Go 1.6부터 런타임은 지도의 동시 오용을 감지할 수 있습니다. 다른 스레드가 맵을 반복하는 동안 한 스레드가 맵을 수정하는 경우 런타임은 "치명적인 오류: 동시 맵 반복 및 맵 쓰기" 메시지와 함께 애플리케이션을 중단시킬 수 있습니다.

이 상황은 다음과 같이 유발될 수 있습니다.

m := map[string]string{"\xff": "a"}

go func() {
    for i := 0; i < 10000; i++ {
        m["x"] = "b"
    }
}()

for i := 0; i < 10000; i++ {
    if _, err := json.Marshal(m); err != nil {
        panic(err)
    }
}
// Output: fatal error: concurrent map iteration and map write
로그인 후 복사

따라서 지도를 동시에 수정하고 정리할 때는 적절한 동기화를 보장하는 것이 중요합니다.

위 내용은 Go에서 `map[string]string`을 마샬링할 때 `json.Marshal`이 언제 실패합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿