Go Academy · Lektion

new() og hvornår pointers skal bruges

Allokering med new og almindelige pointer-mønstre

Lektion 4 af 413 trin

new() og hvornår pointers skal bruges er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

Den indbyggede funktion new()

new(T) allokerer en nulstillet T og returnerer en *T. For structs svarer den til &T{}:

package main
import "fmt"

func main() {
    p := new(int)
    fmt.Println(*p)     // 0
    *p = 42
    fmt.Println(*p)     // 42

    type Point struct{ X, Y int }
    pt := new(Point)
    fmt.Println(*pt)    // {0 0}
}

new kontra &T{}

For structs er &T{} mere idiomatisk og gør det muligt at initialisere felter. new bruges sjældent i moderne Go:

package main
import "fmt"

type Config struct{ Port int; Host string }

func main() {
    a := new(Config)          // zeroed
    b := &Config{Port: 8080}  // initialized
    fmt.Println(a, b)
}

Hvornår du skal returnere en pointer

Returnér en pointer fra en konstruktør, når:

  • Structen har tilstand, og kaldere skal dele den samme instans
  • Structen har metoder med pointermodtagere, hvilket er nødvendigt for at opfylde grænseflader
  • Structen er stor, og kopier ville være dyre

Hvornår du skal returnere en værdi

Returnér en værdi, når:

  • Typen er lille, med nogle få felter
  • Den er uforanderlig konfiguration
  • Du vil gøre det tydeligt, at kaldere får uafhængige kopier

Eksempel: time.Time returneres efter værdi, selv om den har mange metoder.

Pointere i slices og maps

Hvis du gemmer pointere i samlinger, kan ændringer deles:

package main
import "fmt"

type User struct{ Name string; Score int }

func main() {
    users := []*User{{"Alice", 0}, {"Bob", 0}}
    users[0].Score = 100
    fmt.Println(users[0]) // &{Alice 100}
}

Pointer til en primitiv type for valgfrihed

Et felt af typen *int eller *string kan være nil for at betyde "ikke angivet", hvilket er nyttigt for JSON med omitting eller valgfrie databasekolonner:

package main
import "fmt"

type Profile struct {
    Name string
    Age  *int // nil means not provided
}

func main() {
    p := Profile{Name: "Alice"}
    fmt.Println(p.Age == nil) // true
    age := 30
    p.Age = &age
    fmt.Println(*p.Age) // 30
}

Undgå for mange pointere

Overdreven brug af pointere øger belastningen på GC og reducerer cache-lokaliteten. Lav en benchmark, før du ændrer værdityper til pointere udelukkende af hensyn til ydeevnen.

make kontra new

make initialiserer slices, maps og kanaler, fordi de kræver intern opsætning. new allokerer enhver type som nulstillet værdi og returnerer en pointer. De har forskellige formål:

package main
import "fmt"

func main() {
    s := make([]int, 5)           // usable slice
    m := make(map[string]int)     // usable map
    p := new(int)                 // *int pointing to 0
    fmt.Println(s, m, *p)
}

Mønster med uforanderlige pointere

Returnér *T, men dokumentér den som uforanderlig; forbrugere bør ikke ændre den. Dette er almindeligt for konfigurationsobjekter, der deles mellem goroutiner.

Opsummering af pointersikkerhed

Følg disse regler for at bruge pointere sikkert:

  • Kontrollér altid nil, før du derefererer
  • Gem ikke pointere til stackvariabler længere end variablens levetid (Go's escape-analyse håndterer dette)
  • Konvertér aldrig unsafe.Pointer, medmindre det er absolut nødvendigt
  • Lad compileren håndtere stack kontra heap

Hurtigt tjek

Hvad returnerer new(int)?

Opsamling: new og pointere

Vigtigste pointer:

  • new(T) returnerer en nulstillet *T — bruges sjældent; foretræk &T{}
  • Returnér værdier, når typen er lille eller uforanderlig, og pointere, når den har tilstand eller er stor
  • Felter af typen *T gør det muligt at bruge nil som betydning af fravær
  • Brug ikke pointere overalt — GC har en omkostning

Øvelsesopgave

Opret en Settings-struct med et felt af typen *int til MaxConnections. Skriv en funktion, der accepterer *Settings og kun angiver en standardværdi, når feltet er nil.

Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “new() og hvornår pointers skal bruges” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “new() og hvornår pointers skal bruges”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “new() og hvornår pointers skal bruges”?

Allokering med new og almindelige pointer-mønstre Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “new() og hvornår pointers skal bruges”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvad er pointers?
  2. Pointers og funktioner
  3. Pointer receivers på metoder
  4. new() og hvornår pointers skal bruges
← Tilbage til Go Academy