Methodenwerte und Implementierungsmethoden für Methodenausdrücke von Golang-Funktionen
In Golang sind Funktionen erstklassige Bürger. Dies bedeutet, dass Funktionen syntaktisch genau wie andere Werte sind und in Variablen gespeichert, an Funktionen übergeben und von Funktionen zurückgegeben werden können. Darüber hinaus bietet Golang auch Methoden zur Erweiterung des Verhaltens von Typen. Eine Methode ist eine spezielle Funktion, die für einen Typ existiert und auf die Felder und Methoden des Typs zugreifen kann. In diesem Artikel besprechen wir die Implementierungsmethoden für Methodenwerte und Methodenausdrücke von Golang-Funktionen.
Methodenwerte und Methodenausdrücke
Werfen wir zunächst einen Blick auf Methodenwerte und Methodenausdrücke. Der Methodenwert ist ein Funktionswert, an den ein Empfänger gebunden ist. Sie ähnelt einer normalen Funktion, enthält jedoch zusätzlich einen Empfänger, der bei der Definition der Funktion angegeben wird. Daher kann der Methodenwert wie eine normale Funktion übergeben und gespeichert werden, behält aber auch einen Verweis auf den Empfänger bei.
Das Folgende ist ein Beispiel:
type Rect struct { width, height float64 } func (r Rect) Area() float64 { return r.width * r.height } func main() { r := Rect{3, 4} // 获取 Rect 类型的 Area 方法值 f := r.Area // 调用方法值 fmt.Println(f()) }
Im obigen Beispiel definieren wir einen Typ namens Rect
und einen Typ namens Area
für diese Methode. Dieser Area
-Methodenempfänger ist vom Typ Rect
und kann daher nur von Instanzen von Rect
aufgerufen werden. In der main
-Funktion erstellen wir eine Rect
-Instanz r
und erhalten ihren Area
-Methodenwert, speichern ihn in a Variable mit dem Namen f
. Da f
ein Funktionswert ist, können wir ihn wie eine normale Funktion aufrufen, aber er behält auch einen Verweis auf die r
-Instanz bei, sodass er beim Aufruf von Enter < automatisch übergeben wird code>r. Rect
的类型,并为它定义了一个名为 Area
的方法。这个 Area
方法接收者是 Rect
类型,因此它只能被 Rect
的实例调用。在 main
函数中,我们创建了一个 Rect
实例 r
,并获取了它的 Area
方法值,将其存储在名为 f
的变量中。由于 f
是一个函数值,我们可以像调用普通函数一样调用它,但它还保留了对 r
实例的引用,因此它会在调用时自动传入 r
。
类似方法值,方法表达式是绑定了接收者的函数表达式。它与方法值类似,但是它不依赖于任何实例,可以在没有实例时被调用。方法表达式使用类型名作为接收者。
下面是使用方法表达式的例子:
type Rect struct { width, height float64 } func (r Rect) Area() float64 { return r.width * r.height } func main() { // 获取 Rect 类型的 Area 方法表达式 f := Rect.Area fmt.Println(f(Rect{3, 4})) }
在上面的例子中,我们使用 Rect.Area
获取 Rect
类型的 Area
方法表达式。由于方法表达式不依赖于任何实例,因此我们可以直接传递一个 Rect
实例,调用时会自动将它作为接收者。
实现方法的方式
在 Golang 中,有两种方式来实现方法:值接收者和指针接收者。值接收者是将值作为接收者传递给方法,指针接收者是将指针作为接收者传递给方法。值接收者会对方法中的字段进行值拷贝,而指针接收者会将指针作为接收者传递,以便在方法中直接修改字段的值。
下面是采用值接收者的例子:
type Rect struct { width, height float64 } func (r Rect) Scale(factor float64) { r.width *= factor r.height *= factor } func main() { r := Rect{3, 4} r.Scale(2) fmt.Println(r.width, r.height) }
在上面的例子中,我们定义了名为 Scale
的值接收者方法。它接收一个浮点数 factor
,并将 Rect
的宽度和高度乘以它。在调用方法时,由于使用了值接收者,r
实例的值被拷贝到方法中,并对它进行修改。因此,即使在方法中修改了宽度和高度,我们在函数的外部仍然可以访问原始值。
下面是采用指针接收者的例子:
type Rect struct { width, height float64 } func (r *Rect) Scale(factor float64) { r.width *= factor r.height *= factor } func main() { r := &Rect{3, 4} r.Scale(2) fmt.Println(r.width, r.height) }
在上面的例子中,我们定义了名为 Scale
的指针接收者方法。它接收一个浮点数 factor
,并将 Rect
的宽度和高度乘以它。在调用方法时,由于使用了指针接收者,r
rrreee
Im obigen Beispiel verwenden wirRect.Area
, um die Area
vom Typ Rect > Methodenausdruck. Da der Methodenausdruck von keiner Instanz abhängt, können wir eine <code>Rect
-Instanz direkt übergeben und sie wird beim Aufruf automatisch als Empfänger verwendet. 🎜🎜Möglichkeiten zur Implementierung von Methoden🎜🎜In Golang gibt es zwei Möglichkeiten zur Implementierung von Methoden: Wertempfänger und Zeigerempfänger. Ein Wertempfänger übergibt einen Wert als Empfänger an eine Methode, und ein Zeigerempfänger übergibt einen Zeiger als Empfänger an eine Methode. Der Wertempfänger kopiert den Wert des Felds in der Methode, während der Zeigerempfänger den Zeiger als Empfänger übergibt, sodass der Wert des Felds direkt in der Methode geändert werden kann. 🎜🎜Hier ist ein Beispiel für die Verwendung eines Wertempfängers: 🎜rrreee🎜Im obigen Beispiel haben wir eine Wertempfängermethode namens Scale
definiert. Es empfängt eine Gleitkommazahl factor
und multipliziert damit die Breite und Höhe des Rect
. Beim Aufruf einer Methode wird dank der Verwendung eines Wertempfängers der Wert der r
-Instanz in die Methode kopiert und geändert. Selbst wenn Breite und Höhe innerhalb der Methode geändert werden, haben wir außerhalb der Funktion weiterhin Zugriff auf die ursprünglichen Werte. 🎜🎜Das Folgende ist ein Beispiel für die Verwendung eines Zeigerempfängers: 🎜rrreee🎜Im obigen Beispiel haben wir eine Zeigerempfängermethode namens Scale
definiert. Es empfängt eine Gleitkommazahl factor
und multipliziert damit die Breite und Höhe des Rect
. Beim Aufruf einer Methode wird dank der Verwendung von Zeigerempfängern der Zeiger auf die r
-Instanz an die Methode übergeben und ihre Felder können direkt geändert werden. Daher kann auf den geänderten Wert auch außerhalb der Funktion zugegriffen werden. 🎜🎜Fazit🎜🎜Die Methodenwerte und Methodenausdrücke von Golang-Funktionen sind sehr nützlich. Sie können die Lesbarkeit und Wiederverwendbarkeit des Codes erheblich verbessern. Darüber hinaus müssen wir bei der Implementierung einer Methode abhängig von den Besonderheiten des Codes zwischen der Verwendung eines Wertempfängers oder eines Zeigerempfängers wählen. Das Obige ist eine Einführung in die Methodenwerte und Methodenausdrucksimplementierungsmethoden von Golang-Funktionen. Ich hoffe, dass es für Ihre Entwicklungsarbeit hilfreich sein wird. 🎜Das obige ist der detaillierte Inhalt vonGolang-Funktionsmethodenwert und Methodenausdruck-Implementierungsmethode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!