Go Academy · Oppitunti

Sitominen structeihin

Unmarshalaa asetukset

Oppitunti 4/413 vaihetta

Sitominen structeihin on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.

Irrallisista avaimista struct-rakenteeseen

GetString-funktion kutsuminen kaikkialla levittää merkkijonoavaimet ympäri koodia. Konfiguraation unmarshaling tyypitettyyn struct-rakenteeseen antaa kenttien nimet käännösaikaiseen tarkistukseen ja koko rakenteen voi nähdä yhdestä paikasta.

Config-structin määrittäminen

Määritä struct-rakenne, jonka kentissä on mapstructure-tagit, jotta Viper tietää, mikä konfiguraatioavain vastaa mitäkin kenttää. Jokaisen kentän jälkeen tulee tagi, kuten mapstructure:"host", joka kirjoitetaan oikeassa Go-lähdekoodissa takakenoihin.

type ServerConfig struct {
    Host string // tag: mapstructure host
    Port int    // tag: mapstructure port
}

type Config struct {
    Server ServerConfig // tag: mapstructure server
    Debug  bool         // tag: mapstructure debug
}

Unmarshaling-kutsun tekeminen

Kun konfiguraatio on luettu, pura se struct-rakenteeseen:

var cfg Config
if err := viper.Unmarshal(&cfg); err != nil {
    log.Fatalf("unable to decode config: %v", err)
}
fmt.Println(cfg.Server.Port)

Miksi mapstructure eikä json

Viper käyttää mapstructure-kirjastoa, koska konfiguraatio voi tulla monista formaateista, kuten YAML:stä, ympäristömuuttujista ja TOML:sta, eikä vain JSON:sta. mapstructure-tagi on formaatista riippumaton ja purkaa arvot yleisestä map-rakenteesta.

Yhden alirakenteen unmarshaling

Voit purkaa vain yhden osion UnmarshalKey-funktiolla:

var sc ServerConfig
viper.UnmarshalKey("server", &sc)
fmt.Println(sc.Host, sc.Port)

Sisäkkäiset kentät ja slice-kentät

mapstructure käsittelee sisäkkäiset rakenteet ja slicet automaattisesti:

  • Sisäkkäiset struct-rakenteet vastaavat sisäkkäisiä konfiguraatio-osioita
  • []string-kenttä vastaa YAML- tai JSON-taulukkoa

Slice-kentässä olisi mapstructure:"hosts"-tagi, joka kirjoitetaan oikeassa lähdekoodissa takakenoihin.

type Config struct {
    Hosts []string // tag: mapstructure hosts
}

Kenttien oletusarvot

Jos avain puuttuu eikä oletusarvoa ole asetettu, kenttä saa Go-kielen nolla-arvon: 0, tyhjän merkkijonon tai false-arvon. Yhdistä struct-sidonta ja SetDefault, jotta saat käyttökelpoiset arvot varmasti.

Puretun struct-rakenteen validointi

Validoi struct-rakenne unmarshalingin jälkeen. Yleinen käytäntö on Validate()-metodi, joka palauttaa virheen mahdottomista yhdistelmistä, kuten portista 0 tai tyhjästä isännästä.

func (c Config) Validate() error {
    if c.Server.Port == 0 {
        return fmt.Errorf("server.port is required")
    }
    return nil
}

Dekoodausvirheet ovat tyypitettyjä

Jos arvo ei sovi kentän tyyppiin (esimerkiksi merkkijono, vaikka odotetaan int-arvoa), dekoodaus palauttaa kenttää kuvaavan virheen. Tarkistakaa virhe aina ja tuokaa se näkyviin sen sijaan, että jättäisitte sen huomiotta.

Sama ajatus encoding/json-paketilla

Vakiokirjastolla JSON voidaan dekoodata samalla tavalla. Eksplisiittisten struct tagien avulla se täyttää tyypitetyt kentät, kun taas map antaa yleisen tavan käyttää tietoja. Alla oleva suoritettava esimerkki käyttää sisäkkäistä map-rakennetta, jotta pelaaja voi suorittaa sen ilman struct tageja.

Suoritettava: sisäkkäisen konfiguraation dekoodaus

Tämä itsenäinen ohjelma dekoodaa sisäkkäisen JSON-konfiguraation yleiseksi map-rakenteeksi ja lukee sisäkkäiset kentät jäljitellen sitä, miten Unmarshal täyttää struct-rakenteen.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    raw := "{\"server\":{\"host\":\"localhost\",\"port\":8080},\"debug\":true}"
    var c map[string]any
    if err := json.Unmarshal([]byte(raw), &c); err != nil {
        panic(err)
    }
    srv := c["server"].(map[string]any)
    fmt.Printf("%v:%v debug=%v\n", srv["host"], srv["port"], c["debug"])
}

Pikatesti

Testatkaa, miten hyvin ymmärrätte konfiguraation sitomisen struct-rakenteisiin.

Kertaus

Opitte sitomaan konfiguraation struct-rakenteisiin:

  • Käyttäkää mapstructure-tageja ja viper.Unmarshal(&cfg)-kutsua
  • UnmarshalKey dekoodaa yhden alirakenteen
  • Sisäkkäiset struct-rakenteet ja slicet dekoodataan automaattisesti
  • Lisätkää Validate()-metodi virheellisten yhdistelmien havaitsemiseksi ajoissa
Aloita maksutta

Opi Go tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Sitominen structeihin” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sitominen structeihin”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sitominen structeihin”?

Unmarshalaa asetukset Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Sitominen structeihin”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Go Academy-oppitunnilla?

Kyllä. Jokainen Go Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Asetustiedostojen lukeminen
  2. Ympäristömuuttujat
  3. Oletusarvot ja seuranta
  4. Sitominen structeihin
← Takaisin: Go Academy