Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Funktionsmethodenwert und Methodenausdruck-Implementierungsmethode

Golang-Funktionsmethodenwert und Methodenausdruck-Implementierungsmethode

WBOY
WBOYOriginal
2023-05-16 20:40:53726Durchsuche

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 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

Ähnlich wie Methodenwerte sind Methodenausdrücke an Empfänger gebundene Funktionsausdrücke. Es ähnelt einem Methodenwert, hängt jedoch von keiner Instanz ab und kann aufgerufen werden, wenn keine Instanz vorhanden ist. Methodenausdrücke verwenden Typnamen als Empfänger.

Das Folgende ist ein Beispiel für die Verwendung des Methodenausdrucks:

rrreee

Im obigen Beispiel verwenden wir Rect.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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn