go / beginner
Snippet
Methoden und Value- vs Pointer-Receiver
Go hat keine Klassen, aber du kannst Methoden auf Typen definieren. Eine Methode hat einen Receiver-Parameter zwischen func und dem Methodennamen. Value-Receiver (r Rectangle) erhalten eine Kopie, während Pointer-Receiver (r *Rectangle) einen Zeiger auf das Original erhalten. Nutze Pointer-Receiver, wenn du den Receiver modifizieren musst oder wenn die Struct groß ist (um Kopien zu vermeiden). Konventionsgemäß sollten alle Methoden einen Pointer-Receiver haben, wenn irgendeine Methode auf einem Typ einen hat.
snippet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package mainimport "fmt"type Counter struct {value int}func (c Counter) GetValue() int {return c.value}func (c *Counter) Increment() {c.value++}func (c *Counter) Add(v int) {c.value += v}type Rectangle struct {Width, Height int}func (r Rectangle) Area() int {return r.Width * r.Height}func (r *Rectangle) Scale(factor int) {r.Width *= factorr.Height *= factor}func main() {c := Counter{value: 10}fmt.Println("Initial:", c.GetValue())c.Increment()fmt.Println("After increment:", c.value)c.Add(5)fmt.Println("After adding 5:", c.value)rect := Rectangle{Width: 5, Height: 3}fmt.Printf("Area: %d\n", rect.Area())rect.Scale(2)fmt.Printf("Scaled area: %d (Width: %d, Height: %d)\n",rect.Area(), rect.Width, rect.Height)}
Erklärung
1
func (c Counter) GetValue() int
Value-Receiver - erhält eine Kopie von Counter. Sicher aber kann Original nicht modifizieren.
2
func (c *Counter) Increment()
Pointer-Receiver - kann c.value modifizieren. Go handhabt & und * automatisch.
3
rect.Area()
Value-Receiver funktioniert bei Value-Typen; rect wird für den Methodenaufruf kopiert
4
rect.Scale(2)
Pointer-Receiver modifiziert das Original; Go übergibt automatisch &rect