web-dev-qa-db-ja.com

構造体フィールドの大文字

私はこのライブラリを使用してCouchDB(具体的にはcloudant)「github.com/mikebell-org/go-couchdb」にアクセスしていますが、問題があることに気付きました。

ファイルをデータベースに追加して構造体を渡すと、大文字で始まる構造体のフィールドのみが追加されます。

例えば

type Person struct {
    name string
    Age  int
}

func main() {
    db, _ := couchdb.Database(Host, database, username, password)
    joe := Person{
        name: "mike",
        Age:  190,
    }
    m, _ := db.PostDocument(joe)
}

この場合、「年齢」フィールドのみが更新され、データベースに挿入されました。

別のケースでもこの問題に気づきました-このようなことをしているとき:

type Sample struct {
    Name string
    age  int 
}


joe := Sample{
    Name: "xx",
    age:  23,
}

byt, _ := json.Marshal(joe)

post_data := strings.NewReader(string(byt))
fmt.Println(post_data)

この場合、名前のみが出力されます。

output : &{{"Name":"xx"} 0 -1}

どうしてこれなの?小文字のフィールドがあり、データベース内にありたい場合、それは可能ですか?

30
Saif Abid

これは、大文字で始まるフィールドのみがエクスポートされるため、つまり現在のパッケージの外側(この場合はjsonパッケージ内)に表示​​されるためです。

これを参照する仕様の一部を次に示します。 http://golang.org/ref/spec#Exported_identifiers

それでも、「タグ」と呼ばれるものを使用して、大文字で始まらないjsonフィールドを非整列化できます。 jsonパッケージの場合、これは使用する構文です。

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

詳細は documentation を参照してください。

42
julienc

jsonパッケージでは、stringfiyフィールドのみが大文字で始まります。 http://golang.org/pkg/encoding/json/ を参照

次のように構造体を定義する必要があります:

type Sample struct{
    Name string `json:"name"`
    Age int `json:"age"`
}
5
chendesheng