Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiere ich einen bekannten Typ in einen Zeiger auf einen Typparameter in einem Schalter?

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

王林
王林nach vorne
2024-02-09 11:30:18962Durchsuche

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
}

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

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
}

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)

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen