Direct naar de hoofdinhoud
Module 5 · Les 1 van 521/50 in de cursus~12 min
Modulelessen (1/5)

Een structuur definiëren en gebruiken

Een struct groepeert benoemde velden in één type. Het is Go's manier van het bouwen van ‘objecten’ – letterlijker en directer dan klassen, met geen overerving en geen ingebouwde constructors.

Verklaring

Go
type Person struct {
    Name string
    Age  int
}

type introduceert een nieuw benoemd type. Velden worden één per geschreven lijn, name type. Opeenvolgende velden van hetzelfde type kunnen de verklaring: X, Y int.

Creatie

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

Toegang tot het veld

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

Op een pointer werkt ptr.Name direct: Go voert de impliciete verwijzing. Geen -> zoals in C.

Zichtbaarheid: de hoofdletterregel

Velden met een hoofdletter initiaal worden geëxporteerd (zichtbaar vanuit andere pakketten); kleine letters = privé voor het huidige pakket.

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

Dezelfde regel is van toepassing op elke identificatie in Go: typen, functies, variabelen, velden.

Anonieme en geneste structuren

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

Vergelijkbaarheid

Twee structuren zijn vergelijkbaar met == als AL hun velden dat zijn vergelijkbaar (geen slice/maps/funcs erin):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

Hierdoor kunt u ze ook gebruiken als kaartsleutels.

Probeer het

Oefening#go.m5.l1.e1
Pogingen: 0Laden…

Definieer het persoonstype met de tekenreeks Naam en Leeftijd int, en concretiseer dit vervolgens als {Naam: 'Ada', Leeftijd: 36} in hoofdbestanddeel.

Editor laden…
Toon hint

Syntaxis: `type Naam struct { Veldtype; ... }`.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m5.l1.e2
Pogingen: 0Laden…

Druk de waarde af van het veld Naam van p (een bestaande persoon).

Editor laden…
Toon hint

Veldtoegang: `p.Veld`.

Oplossing beschikbaar na 3 pogingen

Quiz#go.m5.l1.e3
Klaar

Wat is de zichtbaarheid van een 'naamstring'-veld (kleine letters) uit een ander pakket?

Go
// in package other
type X struct {
    name string
}
Antwoordmogelijkheden

Samenvatten

  • type Name struct { ... }: nieuw benoemd type met benoemde velden.
  • Constructie: T{Field: value, ...} (aanbevolen) of positioneel.
  • Nulwaarde: elk veld heeft de nulwaarde van het type.
  • &T{...} en new(T) voor een aanwijzer; impliciete dereferentie (p.Field op *T).
  • Hoofdletters = geëxporteerd; kleine letters = privé voor het pakket.
  • Structuren zijn vergelijkbaar met == als alle velden dat zijn; bruikbaar als kaartsleutels.