Avatar ·

Pointer vs. Value: Wann man * und & in Go-Parametern und Rückgabewerten verwendet?

Ich habe gerade angefangen, Go zu lernen, und bin ständig verwirrt, wann ich einen Pointer und wann einen Wert übergeben soll. Ich habe zwar eine Menge Artikel gelesen, aber in der Praxis mache ich es trotzdem falsch. Zum Beispiel habe ich eine User-Struct und eine Funktion, die sie aktualisiert: ```go type User struct { Name string Age int Score float64 } func UpdateScore(u User, newScore float64) { u.Score = newScore } ``` Wenn ich `UpdateScore(myUser, 95.5)` aufrufe, bleibt `myUser.Score` nach dem Aufruf unverändert. Ich habe verstanden, dass das daran liegt, dass Go die Struct kopiert. Also ändere ich es zu `*User`: ```go func UpdateScore(u *User, newScore float64) { u.Score = newScore } ``` Jetzt funktioniert es. Aber wenn ich eine Funktion schreibe, die einen neuen Benutzer zurückgibt, sehe ich zwei Varianten: ```go func NewUser(name string, age int) User { ... } func NewUserPtr(name string, age int) *User { ... } ``` Welche ist die richtige? Und noch etwas: Wie verhält es sich mit großen Structs? Soll ich überall Pointer verwenden? Und was ist mit Basistypen?