> 백엔드 개발 > Golang > 패키지 외부에서 Go 구조체의 대문자 필드에만 액세스할 수 있는 이유는 무엇이며, JSON 마샬링 및 데이터베이스 상호 작용에 소문자 필드를 포함하려면 어떻게 해야 합니까?

패키지 외부에서 Go 구조체의 대문자 필드에만 액세스할 수 있는 이유는 무엇이며, JSON 마샬링 및 데이터베이스 상호 작용에 소문자 필드를 포함하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-02 05:25:12
원래의
510명이 탐색했습니다.

Why are only capitalized fields in Go structs accessible outside the package, and how can I include lowercase fields in JSON marshaling and database interactions?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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