Heim  >  Artikel  >  Backend-Entwicklung  >  Wie überschreibe ich eingebettete Strukturmethoden in Go, ohne die Basisstruktur zu beeinträchtigen?

Wie überschreibe ich eingebettete Strukturmethoden in Go, ohne die Basisstruktur zu beeinträchtigen?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 03:01:03269Durchsuche

How to Override Embedded Struct Methods in Go Without Affecting the Base Struct?

Eingebettete Strukturmethoden in Go überschreiben

In Go erben eingebettete Strukturen die Felder und Methoden ihrer Basisstrukturen. Es kann jedoch zu einem Konflikt kommen, wenn sowohl die Basisstruktur als auch die eingebettete Struktur eine Methode mit demselben Namen implementieren. In diesem Artikel wird eine Lösung untersucht, um die Methode der eingebetteten Struktur zu überschreiben, ohne die Basisstruktur zu beeinträchtigen.

Betrachten Sie den folgenden Code:

<code class="go">package main

import "fmt"

type Base struct {
    val int
}

func (b *Base) Set(i int) {
    b.val = i
}

type Sub struct {
    Base
    changed bool
}

func (b *Sub) Set(i int) {
    b.val = i
    b.changed = true
}

func main() {
    s := &Sub{}
    s.Base.Set(1)
    var b *Base = &s.Base

    // Both print the same value
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

Hier bettet der Sub-Typ den Basistyp ein. Sowohl Sub als auch Base verfügen über eine Methode namens Set. Wenn Sie s.Base.Set() aufrufen, umgehen Sie die Methode Sub.Set() und rufen direkt die Methode Base.Set() auf.

Zu Wenn Sie die Methode der eingebetteten Struktur überschreiben möchten, können Sie stattdessen die Methode Sub.Set() aufrufen. Wenn in Go ein Typ eine Methode mit demselben Namen wie sein eingebetteter Typ implementiert, wird die eingebettete Methode ausgeblendet.

Hier ist eine aktualisierte Version des Codes:

<code class="go">func (b *Sub) Set(i int) {
    b.Base.Set(i) // Call the Base.Set() method
    b.changed = true
}

func main() {
    s := &Sub{}
    s.Set(1)
    var b *Base = &s.Base

    // Note: b.val is now 1
    // s.changed is now true
    fmt.Printf("%+v\n", b)
    fmt.Printf("%+v\n", s)
}</code>

In diesem Beispiel Wenn Sie s.Set(1) aufrufen, wird die Methode Sub.Set() aufgerufen, die wiederum die Methode Base.Set() aufruft. Dadurch wird das Val-Feld der in Sub eingebetteten Basisstruktur aktualisiert. Das geänderte Feld wird auch auf „true“ gesetzt, um anzuzeigen, dass der Wert geändert wurde.

Mit dieser Lösung können Sie die Methode der eingebetteten Struktur überschreiben, ohne die Basisstruktur zu beeinträchtigen. Dies ist eine gängige Technik, die in Go verwendet wird, um Wiederverwendbarkeit und Flexibilität des Codes zu erreichen.

Das obige ist der detaillierte Inhalt vonWie überschreibe ich eingebettete Strukturmethoden in Go, ohne die Basisstruktur zu beeinträchtigen?. 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