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:
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.
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:
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.
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:
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!