capypad
0 Tage Serie
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
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 main
 
import "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 *= factor
r.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