Lekcje modułu (4/5)
Tagi pól i JSON
Tagi w polach strukturalnych to ciągi metadanych odczytywane poprzez odbicie
przez biblioteki takie jak encoding/json, encoding/xml, walidatory, ORM. Oni
są zapisywane pomiędzy backtickami (surowym ciągiem znaków) zaraz po typie pola.
Składnia
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Konwencja formatu: key:"value" oddzielone spacjami (NOT
przecinki) dla wielu kluczy:
type User struct {
Email string `json:"email" validate:"required,email"`
}znacznik json: opcje
Najbardziej powszechną opcją jest json, używana przez encoding/json:
| Oznacz | Efekt |
|---|---|
| KODEF0 | Zmienia nazwę pola na nome w danych wyjściowych JSON |
| KODEF2 | Pomija pole, jeśli ma ono wartość zerową |
| KODEF3 | Nie serializuj/deserializuj tego pola |
| KODEF4 | Zachowuje nazwę pola Go, ale z kodem omitempty |
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
Password string `json:"-"`
}
u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b)) // {"nome":"Ada"}Age jest pominięty (wartość zerowa 0 + omitempty); KODEF3 jest
całkowicie wykluczone.
Marszałek i Unmarszałek
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal akceptuje tylko wskaźnik, ponieważ musi pisać do
pola wartości.
Inne popularne tagi
- KODEF0 — KODEF1
yaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— plac zabaw/walidatorform:"..."— wiązanie gin/echo
Biblioteki czytają je poprzez refleksję (reflect.StructTag.Get("json")):
są to tylko ciągi znaków, dopóki ktoś ich nie zinterpretuje.
Spróbuj
Dodaj znacznik json:"nome" do pola Nazwa i znacznik json:"eta" do pola Wiek.
Pokaż wskazówkę
Tagi to nieprzetworzone ciągi znaków znajdujące się pomiędzy znacznikami wstecznymi zaraz po typie pola.
Rozwiązanie dostępne po 3 próbach
Dodaj opcję omitempty do pola Wiek: należy ją pominąć, jeśli wynosi 0.
Pokaż wskazówkę
Opcje znajdują się po nazwie i są oddzielone przecinkiem: json:"nome,omitempty".
Rozwiązanie dostępne po 3 próbach
Co wypisuje ze znacznikami json: „nome” i json: „eta”?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Podsumowanie
- Tagi to surowe ciągi znaków pomiędzy backtickami:
`key:"wartość" klucz2:"wartość2"`. json:"nome": rename.omitempty: omit if zero value.-: exclude.- NON-exported (lowercase) fields are ignored by
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(pointer).- Same mechanism for
xml,yaml0db1validate2form, …