Go 구조체의 필드 가시성 이해
Go에서 구조체로 작업할 때 개발자는 대문자 식별자가 있는 필드에만 액세스할 수 있는 문제에 자주 직면합니다. 현재 패키지 외부. 이는 데이터베이스에 구조체를 저장하거나 JSON으로 마샬링할 때 특히 문제가 될 수 있습니다.
제공된 코드 조각에서 Person 및 Sample 구조체에는 대문자와 소문자 식별자가 모두 포함된 필드가 포함되어 있습니다. 그러나 CouchDB 데이터베이스와 상호작용하거나 샘플 구조체를 JSON으로 변환하는 경우 대문자 식별자가 있는 필드만 포함됩니다.
이 동작은 Go의 가시성 규칙에 뿌리를 두고 있습니다. 현재 패키지 내에서 볼 수 있습니다. JSON 인코더와 CouchDB 클라이언트는 서로 다른 패키지에 있으므로 구조체에서 소문자 식별자가 있는 필드에 직접 액세스할 수 없습니다.
해결책: JSON 태그 사용
이러한 제한으로 인해 Go는 "JSON 태그"라는 메커니즘을 제공합니다. JSON 태그를 사용하면 JSON 마샬링 및 역마샬링 중에 구조체 필드를 인코딩하고 디코딩하는 방법을 지정할 수 있습니다. 소문자 식별자가 포함된 필드에 JSON 태그를 추가하면 JSON 인코더에 해당 태그가 표시되도록 할 수 있습니다.
예:
type Sample struct { Name string `json:"name"` Age int `json:"age"` }
이 업데이트된 코드에서 이름과 나이 필드는 모두 json 지시문으로 태그가 지정됩니다. 이는 age가 소문자로 시작하더라도 마샬링 중에 두 필드를 모두 포함하도록 JSON 인코더에 지시합니다.
CouchDB로 확장
CouchDB 액세스를 위해 지정된 라이브러리는 JSON 태그를 명시적으로 지원하지 않으면 Go 표준 라이브러리의 JSON 인코딩 기능을 활용하여 원하는 결과를 얻을 수 있습니다. 다음은 태그된 필드를 사용하는 PostDocument 함수의 수정된 버전입니다.
func (db *Database) PostDocument(v interface{}) (*Document, error) { b, err := json.Marshal(v) if err != nil { return nil, err } resp, err := db.httpClient.Post(db.URL+db.name+"/", "application/json", bytes.NewReader(b)) if err != nil { return nil, err } defer resp.Body.Close() return decodeDocument(resp.Body) }
json.Marshal 함수를 사용하여 구조체를 데이터베이스에 게시하기 전에 JSON으로 변환하면 태그된 필드가 올바르게 인코딩됩니다.
결론
Go의 필드 가시성 규칙 이해 및 활용 JSON 태그는 패키지 경계를 넘어 구조체로 작업할 때 중요합니다. 이러한 원칙을 적용하면 데이터 교환 중에 모든 필드에 액세스하고 적절하게 직렬화할 수 있습니다.
위 내용은 패키지 외부에서 Go 구조체의 대문자 필드에만 액세스할 수 있는 이유는 무엇이며, JSON 마샬링 및 데이터베이스 상호 작용에 소문자 필드를 포함하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!