Das Folgende ist eine detaillierte Erklärung von Golangs Reflexion (Beispiel) aus der Kolumne Golang-Tutorial. Ich hoffe, dass es Freunden in Not hilfreich sein wird!
Reflection hat in vielen Sprachen seine wunderbaren Einsatzmöglichkeiten. In der Informatik bezeichnet Reflexion eine Klasse von Anwendungen, die selbstbeschreibende Angriffe und selbstkontrollierende Angriffe ermöglichen.
In diesem Artikel werden die Anmerkungen des Autors zu Golangs Reflexion aufgezeichnet.
Nach 10 Sekunden liegen Ihnen die folgenden Wissenspunkte nahe:
1. Einführung in die Reflexion
2.
3. Was genau Reflexion bewirken kann?
2. Warum Reflexion nutzen? Manchmal benötigen wir beispielsweise eine Funktion, die verschiedene Arten von Werten verarbeiten kann. Ohne den Typ zu kennen, könnten Sie schreiben:
// 伪代码 switch value := value.(type) { case string: // ...一些操作 case int: // ...一些操作 case cbsStruct: // 自定义的结构体 // ...一些操作 // ... }
.
3. Was genau kann Reflexion bewirken? ?? Eingabe abrufen Der Wert der Daten in der Parameterschnittstelle wird zurückgegeben
0 <- Beachten Sie, dass es 0 ist.Reflect.TypeOf()
Null < zurückgegeben. Beachten Sie, dass es Null ist Die „Variable des Schnittstellentyps“ wird in die Variable „Reflektierter Schnittstellentyp“ umgewandelt. Das Obige gibt beispielsweise tatsächlich die Schnittstellenobjekte „reflect.Value“ und „reflect.Type“ zurück. (Sie können dies ermitteln, indem Sie den Rückgabetyp der relevanten Funktion gemäß der IDE verfolgen.) 2. Reflexion der Struktur
package main import ( "fmt" "reflect" ) func main() { var name string = "咖啡色的羊驼" // TypeOf会返回目标数据的类型,比如int/float/struct/指针等 reflectType := reflect.TypeOf(name) // valueOf返回目标数据的的值,比如上文的"咖啡色的羊驼" reflectValue := reflect.ValueOf(name) fmt.Println("type: ", reflectType) fmt.Println("value: ", reflectValue) }
3. Reflexion anonymer oder eingebetteter Feldertype: string value: 咖啡色的羊驼Nach dem Login kopieren
package main import ( "fmt" "reflect" ) type Student struct { Id int Name string } func (s Student) Hello(){ fmt.Println("我是一个学生") } func main() { s := Student{Id: 1, Name: "咖啡色的羊驼"} // 获取目标对象 t := reflect.TypeOf(s) // .Name()可以获取去这个类型的名称 fmt.Println("这个类型的名称是:", t.Name()) // 获取目标对象的值类型 v := reflect.ValueOf(s) // .NumField()来获取其包含的字段的总数 for i := 0; i < t.NumField(); i++ { // 从0开始获取Student所包含的key key := t.Field(i) // 通过interface方法来获取key所对应的值 value := v.Field(i).Interface() fmt.Printf("第%d个字段是:%s:%v = %v \n", i+1, key.Name, key.Type, value) } // 通过.NumMethod()来获取Student里头的方法 for i:=0;i<t.NumMethod(); i++ { m := t.Method(i) fmt.Printf("第%d个方法是:%s:%v\n", i+1, m.Name, m.Type) } }
Ausgabe: | |
---|---|
Ausgabe: | 6 Methode durch Reflexion |
##4. Bei der Verwendung von Reflektion müssen Sie zunächst feststellen, ob der zu bedienende Wert vom erwarteten Typ ist und ob er „zugeordnet“ werden kann. , sonst funktioniert das Reflect-Paket nicht und erzeugt gnadenlose Panik. | 2. Reflexion hängt hauptsächlich mit dem Schnittstellentyp von Golang zusammen. Nur Schnittstellentypen verfügen über Reflexion. Wenn Sie interessiert sind, können Sie einen Blick auf TypeOf und ValueOf werfen. Sie werden feststellen, dass die Parameter bei der Übergabe in Schnittstellentypen konvertiert wurden. package main import ( "fmt" "reflect" ) type Student struct { Id int Name string } func (s Student) EchoName(name string){ fmt.Println("我的名字是:", name) } func main() { s := Student{Id: 1, Name: "咖啡色的羊驼"} v := reflect.ValueOf(s) // 获取方法控制权 // 官方解释:返回v的名为name的方法的已绑定(到v的持有值的)状态的函数形式的Value封装 mv := v.MethodByName("EchoName") // 拼凑参数 args := []reflect.Value{reflect.ValueOf("咖啡色的羊驼")} // 调用函数 mv.Call(args) } Nach dem Login kopieren Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von Golangs Reflexion (Beispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Vorheriger Artikel:Wie man Unit-Tests elegant mit go schreibt
Nächster Artikel:So unterscheiden Sie zwischen leeren Feldern und nicht gesetzten Feldern bei der Verwendung von JSON in Golang
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
Neueste Artikel des Autors
Aktuelle Ausgaben
So zeigen Sie die mobile Version von Google Chrome an
Hallo Lehrer, wie kann ich Google Chrome in eine mobile Version umwandeln?
Aus 2024-04-23 00:22:19
0
11
2425
verwandte Themen
Mehr>
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
|