Wie konvertiere ich einen bekannten Typ in einen Zeiger auf einen Typparameter in einem Schalter?

王林
Freigeben: 2024-02-09 11:30:18
nach vorne
993 Leute haben es durchsucht

Wie konvertiere ich einen bekannten Typ in einen Zeiger auf einen Typparameter in einem Schalter?

Der PHP-Editor Banana zeigt Ihnen, wie Sie einen bekannten Typ in einen Zeiger auf den Typparameter im Schalter umwandeln. Beim Programmieren müssen wir manchmal eine Variable eines bekannten Typs in einen Zeiger umwandeln, um flexiblere Operationen im Programm zu ermöglichen. Diese Konvertierung kann mithilfe des Operators „&“ erreicht werden. Stellen Sie dem Variablennamen den Operator „&“ voran, um ihn in einen Zeiger auf die Variable umzuwandeln. Auf diese Weise können wir Zeiger im Programm verwenden, um Variablen zu manipulieren, anstatt sie nur zuzuweisen oder zu lesen. Als nächstes werden wir detailliert vorstellen, wie diese Typkonvertierung durchgeführt wird, und Beispielcode bereitstellen, damit jeder es besser versteht.

Frageninhalt

Ich versuche, eine Funktion zu schreiben, die das Byte-Array eines JSON-Strings basierend auf dem Typparameter des Rückgabewerts umwandelt. Die Regeln lauten wie folgt:

  • map[string]interface{}: konvertiert in map[string]interface{}
  • []Byte: Keine Konvertierung, Rückgabe unverändert
  • Struktur: In Struktur konvertieren

Mein Code lautet wie folgt:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) { // https://appliedgo.com/blog/a-tip-and-a-trick-when-working-with-generics
    case *[]byte:
        result = &t(jsonbytearray)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
Nach dem Login kopieren

Dieser Code verursacht einen Typfehler beim Konvertieren des Typs von jsonbytearray in t, wie unten gezeigt:

cannot convert jsonByteArray (variable of type []byte) to type T
Nach dem Login kopieren

Wie ordne ich den Zeiger dieser Variablen vom Typ []Byte dem Rückgabewert des generischen Typs zu?

Lösung

Aufgrund t受到any的约束,所以不能直接转换。您必须断言 &jsonbytearray 实际上与该开关情况下的 *t desselben Typs:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) {
    case *[]byte:
        result = any(&jsonbytearray).(*t)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
Nach dem Login kopieren

Dadurch verschwinden die Kompilierungsfehler, aber das Design ist nicht besonders gut. Wenn Sie json.unmarshal 专门用于一种类型 (*[]byte) verwenden müssen, ist es besser, die Aufrufseite zu ändern, anstatt eine generische Funktion zu verwenden.

Ich gehe davon aus, dass Ihr Ziel darin besteht, dem Anrufer zu ermöglichen, einen Teil der Bytes so zu erhalten, wie er ist, und nicht durch Unmarshalling. Dann können Sie auf der Aufrufseite die Funktion als

aufrufen
data := GetJsonData[[]byte](jsonByteArray)
Nach dem Login kopieren

Das bedeutet, dass Sie zu diesem Zeitpunkt bereits wissen jsonbytearray es sich um ein Byte-Slice handelt.

Dann gibt es keinen Grund, diese Funktion aufzurufen. Sie können einfach die Adresse des Parameters abrufen: data := &jsonbytearray ,并在其他地方使用 json.unmarshal .

Das obige ist der detaillierte Inhalt vonWie konvertiere ich einen bekannten Typ in einen Zeiger auf einen Typparameter in einem Schalter?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!