Zeiger oder Werte: Wann man * und & in Parametern und Rückgabewerten von Go verwendet?
Hallo zusammen! Ich habe vor kurzem angefangen, Go zu lernen, und mich quält ständig die Frage: Wann sollte ich Parameter als Zeiger an eine Funktion übergeben und wann als Wert? Und dasselbe gilt für Rückgabewerte.
Ich verstehe irgendwie, dass Zeiger das Kopieren von Daten vermeiden, aber in Go wird doch sowieso alles kopiert? Oder nicht? Ich habe ein kleines Beispiel geschrieben, in dem ich eine User-Struktur erstelle und versuche, sie zu ändern:
```go
type User struct {
Name string
Age int
}
func updateUser(u User) {
u.Name = "New Name" // funktioniert nicht wie erwartet
}
func updateUserPtr(u *User) {
u.Name = "New Name" // funktioniert
}
```
Aber was mich verwirrt: In Go wird doch alles als Wert übergeben, aber slices und maps verhalten sich wie Referenzen? Oder nicht? Ich habe gelesen, dass große Strukturen besser als Zeiger übergeben werden sollten, um Kopien zu vermeiden, und kleine als Wert. Aber was gilt als "groß"? 10 Felder? 20? Oder geht es nicht nur um die Größe?
Außerdem verstehe ich nicht, wann ich einen Zeiger aus einer Funktion zurückgeben sollte und wann einen Wert.