Salt la conținutul principal
Modulul 5 · Lecția 1 din 521/50 în curs~12 min
Lecții din modul (1/5)

Definirea și utilizarea unei structuri

A struct grupează câmpurile denumite într-un singur tip. Este calea lui Go de a construi „obiecte” — mai literal și mai imediat decât clasele, cu fără moștenire și fără constructori încorporați.

Declaraţie

Go
type Person struct {
    Name string
    Age  int
}

type introduce un nou tip denumit. Câmpurile sunt scrise câte unul linie, name type. Câmpurile consecutive de același tip pot partaja declarație: X, Y int.

Creare

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

Acces pe teren

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

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

Pe un pointer, ptr.Name funcționează direct: Go efectuează dereferire implicită. Nu -> ca în C.

Vizibilitate: regula majuscule

Câmpurile cu inițiala majusculă sunt exportate (vizibile din alt pachete); minuscule = privat pentru pachetul curent.

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

Aceeași regulă se aplică fiecărui identificator din Go: tipuri, funcții, variabile, câmpuri.

Structuri anonime și imbricate

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
}

Comparabilitatea

Două structuri sunt comparabile cu == dacă TOATE câmpurile lor sunt comparabil (fără felii/hărți/funcții în interior):

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

Acest lucru vă permite, de asemenea, să le utilizați ca taste pentru hărți.

Încearcă

Exercițiu#go.m5.l1.e1
Încercări: 0Se încarcă…

Definiți tipul de persoană cu șirul de nume și Age int, apoi instanțiați-l ca {Nume: „Ada”, Vârsta: 36} în principal.

Se încarcă editorul...
Afișează indiciu

Sintaxă: `type Name struct { Field Type; ... }`.

Soluție disponibilă după 3 încercări

Exercițiu#go.m5.l1.e2
Încercări: 0Se încarcă…

Tipăriți valoarea câmpului Nume al lui p (o persoană existentă).

Se încarcă editorul...
Afișează indiciu

Acces la câmp: `p.Field`.

Soluție disponibilă după 3 încercări

Quiz#go.m5.l1.e3
Gata

Care este vizibilitatea unui câmp „șir de nume” (minuscule) dintr-un alt pachet?

Go
// in package other
type X struct {
    name string
}
Opțiuni de răspuns

Recapitulare

  • type Name struct { ... }: nou tip denumit cu câmpuri denumite.
  • Construcție: T{Field: value, ...} (recomandat) sau pozițional.
  • Valoare zero: fiecare câmp la tipul lui zero.
  • &T{...} și new(T) pentru un pointer; dereferire implicită (p.Field pe *T).
  • Majuscule = exportate; minuscule = privat la pachet.
  • Structurile sunt comparabile cu == dacă toate câmpurile sunt; utilizabil ca taste pentru hartă.