Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in die erzwungene Übertragung der Golang-Struktur

Detaillierte Einführung in die erzwungene Übertragung der Golang-Struktur

PHPz
PHPzOriginal
2023-03-30 09:08:011924Durchsuche

In der Go-Sprache ist Struktur ein sehr häufiger Datentyp. Eine Struktur ist eine durch eine Reihe von Typen definierte Sammlung. Jede Struktur kann mehrere Felder mit jeweils eigenem Namen und Typ enthalten. In der tatsächlichen Entwicklung verwenden wir häufig die Strukturtypkonvertierung, bei der ein Strukturtyp in einen anderen Strukturtyp umgewandelt wird. Als Nächstes erhalten Sie in diesem Artikel eine detaillierte Einführung in die erzwungene Übertragung der Golang-Struktur.

Golang-Strukturtypzwang verfügt hauptsächlich über die folgenden drei Methoden:

Methode 1: Typzusicherung verwenden

In der Go-Sprache können Sie Typzusicherung (Typzusicherung) verwenden, um Strukturtypzwang zu implementieren. Typzusicherungen können verwendet werden, um zu bestimmen, ob der in einer Schnittstellenvariablen gespeicherte Wert ein bestimmter Typ ist, oder um den Schnittstellentyp in andere Typen zu konvertieren. Hier ist ein Beispiel:

type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    s, ok := interface{}(&p).(*Student)
    if ok {
        fmt.Println(s.Name, s.Age, s.Grade)
    } else {
        fmt.Println("类型转换失败")
    }
}

Im obigen Code wandeln wir die Person-Typstruktur p in eine Student-Typstruktur um. Da es sich bei p tatsächlich um eine Struktur vom Typ Person handelt, schlägt der Konvertierungsvorgang fehl. Um Panik zu vermeiden, verwenden wir die ok-idiom-Methode. Das heißt, wenn wir eine erzwungene Typkonvertierung durchführen, ermitteln wir auch, ob das Ergebnis der Typkonvertierung erfolgreich ist. Bei Erfolg wird das neue Objekt nach der Konvertierung zurückgegeben, andernfalls wird Null zurückgegeben.

Methode 2: In JSON konvertieren und dann in die Zielstruktur konvertieren

Zusätzlich zur Verwendung von Typzusicherungen für die Typkonvertierung können Sie auch JSON-Serialisierung und -Deserialisierung verwenden, um eine erzwungene Konvertierung des Strukturtyps zu erreichen. Die spezifischen Schritte sind wie folgt:

  1. Serialisieren Sie das Quellobjekt in einen JSON-String.
  2. Deserialisieren Sie den JSON-String in das Zielobjekt und die Konvertierung ist abgeschlossen.
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}

func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    b, _ := json.Marshal(&p)
    var s Student
    json.Unmarshal(b, &s)
    fmt.Println(s.Name, s.Age, s.Grade)
}

Im obigen Code wandeln wir die Person-Typstruktur p in eine Student-Typstruktur um. Zuerst verwenden wir die Funktion json.Marshal(), um das Quellobjekt p in einen JSON-String b zu konvertieren. Dann verwenden wir die Funktion json.Unmarshal(), um den JSON-String b in das Zielobjekt s zu deserialisieren. Es muss nicht festgestellt werden, ob die Typkonvertierung erfolgreich ist, da die Funktion json.Unmarshal() keinen Fehler zurückgibt.

Methode 3: Direktes Byte-Kopieren

Zusätzlich zur Verwendung von Typzusicherungen und JSON-Serialisierung und -Deserialisierung für die Typkonvertierung können Sie Bytes auch direkt kopieren. Die spezifischen Schritte lauten wie folgt:

  1. Serialisieren Sie zunächst die Quellstruktur, um ein Byte-Slice zu erhalten.
  2. Kopieren Sie das Byte-Slice in die Zielstruktur.
  3. Deserialisieren Sie die Zielstruktur und die Konvertierung ist abgeschlossen.
type Person struct {
    Name string
    Age  int
}

type Student struct {
    Name string
    Age  int
    Grade int
}


func main() {
    var p Person
    p.Name = "张三"
    p.Age = 22

    // 转换为Student类型
    var s Student
    b, _ := json.Marshal(&p)
    copy((*(*[1 << 20]byte)(unsafe.Pointer(&s)))[:], b)
    fmt.Println(s.Name, s.Age, s.Grade)
}

Im obigen Code wandeln wir die Person-Typstruktur p in eine Student-Typstruktur um. Zuerst verwenden wir die Funktion json.Marshal(), um die Quellstruktur p in ein Byte-Array b zu konvertieren. Anschließend verwenden wir die Funktion copy(), um das Byte-Array b in den Speicherbereich der Zielstruktur zu kopieren Verwenden Sie json. Die Funktion .Unmarshal() deserialisiert die Zielstruktur, um die Typkonvertierung abzuschließen.

Fazit:

Die oben genannten drei Methoden können alle eine Strukturtypkonvertierung erreichen. In der tatsächlichen Entwicklung müssen wir die geeignete Methode entsprechend unseren eigenen Anforderungen auswählen. Es ist zu beachten, dass bei der Konvertierung der Zeigertypstruktur besonderes Augenmerk auf Probleme wie das tiefe Kopieren von Zeigerwerten und die Typkorrektheit gelegt werden sollte.

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die erzwungene Übertragung der Golang-Struktur. 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