new() og hvornår pointers skal bruges
Allokering med new og almindelige pointer-mønstre
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
*Tgø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.
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
- Hvad er pointers?
- Pointers og funktioner
- Pointer receivers på metoder
- new() og hvornår pointers skal bruges