Heim  >  Artikel  >  Backend-Entwicklung  >  Rufen Sie „reflect.Kind' eines Typs ab, der auf einem primitiven Typ basiert

Rufen Sie „reflect.Kind' eines Typs ab, der auf einem primitiven Typ basiert

WBOY
WBOYnach vorne
2024-02-09 15:12:09566Durchsuche

Rufen Sie „reflect.Kind eines Typs ab, der auf einem primitiven Typ basiert

Bei der PHP-Programmierung ist es eine wichtige Fähigkeit, einen Typ zu erhalten, der auf einem primitiven Typ basiert. Reflect.Kind ist eine Eigenschaft in der von PHP bereitgestellten Reflection-Klassenbibliothek, mit der der Datentyp einer Variablen bestimmt werden kann. Durch die Verwendung von „reflect.Kind“ können wir leicht den Typ der Variablen ermitteln und entsprechende Vorgänge und Verarbeitungen durchführen. Für PHP-Entwickler wird die Beherrschung dieser Fähigkeit dazu beitragen, den Reflexionsmechanismus besser zu verstehen und zu nutzen sowie die Lesbarkeit und Flexibilität des Codes zu verbessern. In diesem Artikel stellt der PHP-Editor Baicao ausführlich vor, wie man Reflect.Kind basierend auf primitiven Typen erhält, und stellt einige praktische Beispiele und Techniken vor, um den Lesern zu helfen, diesen Wissenspunkt besser zu beherrschen.

Frageninhalt

Ich möchte „reflect.kind“ als „reflect.interface“ für einen Typ verwenden, der eine Schnittstelle implementiert, dessen Implementierung jedoch auf einem primitiven Typ basiert: type id string

Eine andere Antwort auf diese Frage könnte sein, wie man den „reflect.type“ eines beliebigen Typs erhält, der „reflect.interfaces“ zurückgibt, wenn kind() aufgerufen wird.

Hier ist das vollständige Beispiel für den mobilen Spielplatz:

type ID interface {
    myid()
}

type id string

func (id) myid() {}

func main() {
    id := ID(id("test"))
    
    fmt.Println(id)
    fmt.Println(reflect.TypeOf(id))
    
    // How to get the kind to return "reflect.Interface" from the var "id"?
    fmt.Println(reflect.TypeOf(id).Kind())
}

Lösung

reflect.typeof() (和 reflect.valueof()) 需要一个 接口{}。基本上,无论您传递给 reflect.typeof() 的值是什么,如果它还不是接口值,它将隐式包装在 interface{} 中。如果传递的值已经是接口值,则其中存储的具体值将作为 interface{} Weitersagen.

Um dieses „Umpacken“ zu vermeiden, das einer der seltenen Fälle ist, in denen ein Zeiger auf eine Schnittstelle sinnvoll ist, können Sie es hier tatsächlich nicht vermeiden. Sie müssen einen Zeiger auf den Schnittstellenwert übergeben.

Wenn Sie also einen Zeiger an eine Schnittstelle übergeben, wird der Zeiger in interface{} 值中。您可以使用 type.elem() eingeschlossen, um den Typdeskriptor des „Point-to-Type“ zu erhalten: d. h. den Elementtyp des Zeigertyps, der der Typdeskriptor des sein wird Welchen Schnittstellentyp Sie suchen. p>

Beispiel:

id := id(id("test"))

fmt.println(id)
t := reflect.typeof(&id).elem()
fmt.println(t)

fmt.println(t.kind())

Welche Ergebnisse (versuchen Sie es auf dem go-Spielplatz):

test
main.ID
interface

Verwandte Fragen anzeigen: Was ist der Unterschied zwischen „reflect.valueof()“ und „value.elem()“ in go?

Das obige ist der detaillierte Inhalt vonRufen Sie „reflect.Kind' eines Typs ab, der auf einem primitiven Typ basiert. 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