Golang-Schnittstelle zu struct

PHPz
Freigeben: 2023-05-10 11:12:36
Original
3654 Leute haben es durchsucht

In Golang sind Schnittstelle und Struktur zwei gängige Datentypen. Eine Schnittstelle ist ein abstrakter Typ, der eine Reihe von Methoden ohne Implementierung definiert, während eine Struktur ein konkreter Typ ist, der zum Organisieren und Speichern von Daten verwendet wird. In der tatsächlichen Entwicklung müssen wir möglicherweise die Schnittstelle in eine Struktur konvertieren. In diesem Artikel werden zwei Methoden zum Konvertieren von Schnittstellen in Strukturen in Golang vorgestellt.

1. Verwenden Sie Reflektion, um die Schnittstelle in eine Struktur umzuwandeln.

In Golang können Sie Reflektion verwenden, um den Vorgang der Konvertierung der Schnittstelle in eine Struktur abzuschließen. Reflection ist ein leistungsstarker Mechanismus, der Informationen wie den Wert, den Typ und die Attribute einer Variablen zur Laufzeit dynamisch lesen und ändern kann. Bei der Reflexion werden häufig „reflect.Value“ und „reflect.Type“ verwendet.

Die spezifischen Implementierungsschritte lauten wie folgt:

  1. Erstellen Sie einen Strukturtyp zum Speichern von Daten in der Schnittstelle. Zum Beispiel:
type Person struct {
    Name string
    Age  int
}
Nach dem Login kopieren
  1. Erstellen Sie einen Schnittstellentyp zum Konvertieren von Daten in eine Struktur. Zum Beispiel:
type PersonInterface interface {
    GetName() string
    GetAge() int
}
Nach dem Login kopieren
Nach dem Login kopieren
  1. Implementieren Sie eine Funktion, um den Schnittstellentyp in den Strukturtyp umzuwandeln. Beispiel:
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) {
    var person Person
    value := reflect.ValueOf(p)
    if value.Kind() == reflect.Ptr && !value.IsNil() {
        value = value.Elem()
        if value.Kind() == reflect.Struct {
            person.Name = value.FieldByName("Name").String()
            person.Age = int(value.FieldByName("Age").Int())
            return person, nil
        }
    }
    return person, fmt.Errorf("invalid type:%v", reflect.TypeOf(p))
}
Nach dem Login kopieren

Konvertieren Sie in dieser Funktion zunächst den Schnittstellentyp in einen Reflexionswert (reflect.Value) und bestimmen Sie dann, ob der Wert ein Zeigertyp und nicht null ist. Als nächstes wird der Zeigertyp in einen Strukturtyp konvertiert, dann werden die Feldwerte „Name“ und „Alter“ durch Reflektion abgerufen und schließlich der Strukturtyp „Person“ zurückgegeben.

  1. Testen Sie die Hauptfunktion. Beispiel:
func main() {
    p := &Person{Name: "Tom", Age: 20}
    fmt.Println(p)
    if ps, err := ConvertInterfaceToStruct(p); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println(ps)
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie in diesem Testcode einen Personenstrukturzeiger und verwenden Sie die implementierte ConvertInterfaceToStruct-Funktion, um den Zeigertyp in den Personenstrukturtyp zu konvertieren und das Ergebnis auszugeben.

2. Implementieren Sie die Schnittstelle mit JSON und konvertieren Sie sie in eine Struktur

In Golang ist JSON ein gängiges Datenformat, und ein Objekt kann in eine JSON-Zeichenfolge serialisiert werden. Sie können einen JSON-String auch über json.Unmarshal() in ein Objekt deserialisieren.

Die spezifischen Implementierungsschritte lauten wie folgt:

  1. Erstellen Sie einen Strukturtyp zum Speichern von Daten in der Schnittstelle. Beispiel:
type Person struct {
    Name string `json:"name,omitempty"`
    Age  int    `json:"age,omitempty"`
}
Nach dem Login kopieren

In dieser Struktur wird der JSON-Feldname so angegeben, dass er mit seinem Feldnamen in der Schnittstelle übereinstimmt, um eine Konvertierung zu erreichen.

  1. Erstellen Sie einen Schnittstellentyp zum Konvertieren von Daten in eine Struktur. Zum Beispiel:
type PersonInterface interface {
    GetName() string
    GetAge() int
}
Nach dem Login kopieren
Nach dem Login kopieren
  1. Implementieren Sie eine Funktion, um den Schnittstellentyp in einen Strukturtyp umzuwandeln. Beispiel:
func ConvertInterfaceToStruct(p PersonInterface) (Person, error) {
    jsonStr, err := json.Marshal(p)
    if err != nil {
        return Person{}, err
    }
    var person Person
    err = json.Unmarshal(jsonStr, &person)
    if err != nil {
        return Person{}, err
    }
    return person, nil
}
Nach dem Login kopieren

In dieser Funktion verwenden Sie zuerst json.Marshal(), um den Schnittstellentyp in einen JSON-String zu konvertieren, und verwenden Sie dann json.Unmarshal(), um ihn in einen zu konvertieren Personenstrukturtyp und gibt die Struktur zurück.

  1. Testen Sie die Hauptfunktion. Beispiel:
func main() {
    p := &Person{Name: "Tom", Age: 20}
    fmt.Println(p)
    if ps, err := ConvertInterfaceToStruct(p); err != nil {
        log.Fatal(err)
    } else {
        fmt.Println(ps)
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie in diesem Testcode einen Personenstrukturzeiger und verwenden Sie die implementierte ConvertInterfaceToStruct-Funktion, um den Zeigertyp in den Personenstrukturtyp zu konvertieren und das Ergebnis auszugeben.

Zusammenfassung:

Beide der beiden oben genannten Methoden können den Schnittstellentyp in einen Strukturtyp umwandeln und dabei unterschiedliche Methoden zur Implementierung verwenden. Die Implementierung der Reflexionsmethode ist relativ gering Typbeurteilung und Feldreflexionslesen sind erforderlich, aber die JSON-Methode ist relativ einfach und klar. Sie müssen nur die JSON-Serialisierungs- und Deserialisierungsmethoden in Golang verwenden. Die Wahl der verschiedenen Methoden hängt von Faktoren wie dem tatsächlichen Bedarf und der Leistung ab.

Das obige ist der detaillierte Inhalt vonGolang-Schnittstelle zu struct. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage