php 편집기 Strawberry는 JSON 구문 분석에 대한 문제를 소개합니다. 때때로 우리는 json.Unmarshal을 사용하여 파일 데이터를 구문 분석하는 것이 효과적이지만 json.NewDecoder().Decode()를 사용하는 것이 효과적이지 않은 상황에 직면합니다. 이 문제는 코드 로직이나 데이터 형식에서 발생할 수 있습니다. 아래에서는 가능한 원인을 자세히 분석하고 해결 방법을 제공합니다.
다음은 구조를 올바르게 역마샬링합니다.
으아악그러나 이것은 작동하지 않으며 고전적인 JSON 구문 분석 오류 eof
、unexpected token 't'
등이 많이 발생합니다.
이유를 아시나요? os.file
或 []byte
두 개의 고루틴에서 동시에 사용되는 json 구조는 다음과 같습니다(일부 필드는 생략됨):
func foo() { d, err := os.readfile("file.json") var t t if err := json.unmarshal(d, &t); err != nil { panic(err) } }
os.File
或 []byte
두 개의 고루틴을 동시에 사용하세요...
그게 문제야. os.File
다음 읽기가 발생하는 내부 파일 포인터가 있습니다. 관련되지 않은 두 엔터티가 계속해서 데이터를 읽는 경우 겹치는 데이터를 읽지 못할 수 있습니다. 첫 번째 엔터티에서 읽은 바이트는 두 번째 엔터티에서 반복되지 않습니다.
게다가 os.File
은 동시 사용에 안전하지 않습니다(문서에는 안전하다고 명시적으로 명시되어 있지 않습니다). 여러 동시 고루틴에서 해당 메서드를 호출하면 데이터 경합이 발생할 수 있습니다.
"읽는" 여러 함수/고루틴에 []byte
를 전달하면 공유 포인터나 인덱스 변수가 없습니다. 각 함수/고루틴은 인덱스를 별도로 유지하며 여러 고루틴(이 경우 슬라이스 헤더 및 슬라이스 요소의 필드)에서 변수를 읽어도 괜찮습니다.
위 내용은 json.Unmarshal 파일 데이터는 유효하지만 json.NewDecoder().Decode()는 유효하지 않습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!