


Ein Artikel vermittelt Ihnen die Grundlagen der Reflexion in der Go-Sprache
Was ist Reflexion? Reflexion, ähm..., es bedeutet Umkehrung, also Dinge umdrehen.
Zum Beispiel ein sehr einfacher Code wie dieser.
var a int = 3 fmt.Println(a)
a
Die Variable ist int </ code><code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">a
变量是int
类型,但是反过来想,程序是怎么知道a
是int
Typ, aber denken Sie andersherum, woher weiß das Programm a
int
Beispielcode
v := reflect.TypeOf(a) fmt.Println(v)

Die zweite Codezeile hat die Variable zum zweiten Mal erfolgreich geändert a
a
还原出了int
类型。
什么???你为我有什么用???,嗯。。。实话实说,用的不是太多,但是必须要会的。
反射(reflect包)
在Go中,任何变量,都有具体类型和具体值,就像var a int = 3
,具体类型就是int
,具体值就是3
restauriertint
🎜
🎜Reflection (Reflect-Paket)🎜
🎜In Go hat jede Variable einen 🎜spezifischen Typ strong>🎜🎜 und 🎜Spezifischer Wert🎜🎜, wie 🎜🎜 Der spezifische Typ der Variablen gehört also zu 并且Go的提供了 . 🎜 🎜 🎜 通过 这个是啥意思呢??这个在结构体中比较好体现。 简答来说就是 经过对比,会发现几个特殊问题。 如果变量是指针类型, Wenn die Variable ein Referenztyp (Slice und Map)-Typ ist, 如果变量是结构体, Wenn die Variable eine var a int = 3
🎜🎜, 🎜Spezifischer Typ 🎜🎜 ist 🎜🎜int</code >🎜🎜, 🎜<span md-inline="strong"><strong>Spezifischer Wert</strong>🎜🎜 ist 🎜🎜<code style="font-family: var(--monospace);vertical-align: initial ;border-width : 1px;Rahmenstil: einfarbig;Rahmenfarbe: rgb(231, 234, 237);Hintergrundfarbe: rgb(243, 244, 244);Rahmenradius: 3px;Padding-rechts: 2px ;Padding-links : 2px;font-size: 0.9em;">3
🎜🎜. 🎜🎜reflect.Type
reflect.Type
,变量的具体值归属在reflect.Value
。reflect.TypeOf
获取具体类型。reflect.ValueOf
获取具体值。TypeOf
TypeOf
, der spezifische Wert der Variablen gehört zu reflect.Value
reflect.TypeOf
🎜🎜Holen Sie sich den 🎜🎜🎜spezifischen Typ🎜🎜🎜. 🎜🎜reflect.ValueOf
🎜🎜get🎜 🎜🎜Spezifischer Wert🎜🎜🎜. 🎜🎜🎜TypeOf🎜
Die TypeOf
🎜🎜-Methode kann den 🎜🎜🎜spezifischen Typ🎜🎜🎜 einer Variablen abrufen. 🎜🎜🎜🎜Es besteht die Notwendigkeit, eine Funktion zu definieren, die jeden Datentyp empfangen und den Variablentyp durch Reflexion drucken kann. 🎜🎜示例代码
函数
func reflectType(x interface{}) {
v := reflect.TypeOf(x)
fmt.Printf("你传入的变量类型是:%v\n",v)
}
main
func main() {
var a int = 666
var b float64 = 3.14
var c string = "hello world"
var d [3]int = [3]int{1,2,6}
var e []int = []int{1,2,6,88}
var f map[string]interface{} = map[string]interface{}{
"Name":"张三",
"Age":18,
}
reflectType(a)
reflectType(b)
reflectType(c)
reflectType(d)
reflectType(e)
reflectType(f)
}
执行结果
reflect.TypeOf
方法,完美解决上述需求。TypeOf 的Name和Kind
TypeOf
返回的太笼统了,还有更加细化的类型,通过这俩属性获取。示例代码
函数
func reflectType(x interface{}) {
v := reflect.TypeOf(x)
fmt.Printf("你传入的变量类型是:%v | Name:%v | Kind:%v\n", v, v.Name(), v.Kind())
}
结构体
type Student struct {
Name string
Age int
}
main
func main() {
var a int
var b *int
var c []int
var d map[string]interface{}
var e Student
reflectType(a)
reflectType(b)
reflectType(c)
reflectType(d)
reflectType(e)
}
执行结果
总结
Name
为空,Kind
是ptr
。Name
Name
为空,只有Kind
。Name
是结构体名,Kind
是struct
。ValueOf
TypeOf
ist leer, nur Art
.
Name
🎜🎜 ist Strukturname, 🎜🎜Kind
🎜🎜 Ja 🎜🎜struct
🎜🎜. 🎜🎜🎜ValueOf🎜
🎜TypeOf
nur 🎜🎜 Sie können wiederum den 🎜🎜🎜spezifischen Typ🎜🎜🎜 der Variablen erhalten, aber Sie können nicht den 🎜🎜🎜spezifischen Wert🎜🎜🎜 erhalten, was etwas unfreundlich ist. 🎜🎜
所以ValueOf
就来解决这个问题了,但是ValueOf
牛叉的是,它里面还包括了变量类型。
注:ValueOf
和TypeOf
的Kind
属性返回内容是一摸一样的。
需求:定义一个函数,可以接收任意类型,通过反射得出变量类型和变量值。
函数
func reflectType(x interface{}) { v := reflect.ValueOf(x) k := v.Kind() switch k { case reflect.Int: fmt.Printf("我是Int类型,我的值是%v\n",v.Int()) case reflect.Slice: fmt.Printf("我是切片类型,我的值是%v\n",v.Slice(1,2)) case reflect.Map: fmt.Printf("我是切片类型,我的值是%v\n",v.MapKeys()) //case :可以继续case下去 } }
main
func main() { var a int = 1 var c []int = []int{1, 5, 7, 19} var d map[string]interface{} = map[string]interface{}{ "Name": "你好", "Age": 18, } var e Student reflectType(a) reflectType(c) reflectType(d) reflectType(e) }
执行结果
通过反射设置值
反射还有一个用途,就是动态的修改变量值,可能你暂时体会不到,但是语法还是要学的。
通过反射设置值,需要用到Elem
方法,并且传入的必须是指针。
示例代码
函数
func reflectSetValue(x interface{}) { v := reflect.ValueOf(x) //kind也必须是Elem调用 var k = v.Elem().Kind() switch k { case reflect.Int: //反射修改必须通过Elem v.Elem().SetInt(200) } }
main
func main() { var a int = 10 fmt.Printf("a的值:%v\n", a) //反射修改值传入的必须是地址 reflectSetValue(&a) fmt.Printf("a的值:%v\n", a) }
执行结果
总结
上述我们学习了Go基础反射的TypeOf
TypeOf
,TypeOf的Name和Kind
,ValueOf
,通过反射设置值
。
其中Kind
在Type
和ValueOf
中都有,通常情况下TypeOf
和ValueOf
,TypeOf的Name和Kind
,ValueOf
通过反射设置值
🎜🎜。🎜🎜Kind🎜🎜在🎜🎜<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background -color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">Type🎜🎜和🎜🎜ValueOf🎜🎜中都有,通常情况下🎜🎜TypeOf
🎜🎜和🎜🎜ValueOf🎜🎜一起使用效果更佳!🎜 🎜🎜🎜反射这一块!坚持!!🎜🎜
Das obige ist der detaillierte Inhalt vonEin Artikel vermittelt Ihnen die Grundlagen der Reflexion in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was soll ich tun, wenn die benutzerdefinierten Strukturbezeichnungen in Goland nicht angezeigt werden? Bei der Verwendung von Goland für GO -Sprachentwicklung begegnen viele Entwickler benutzerdefinierte Struktur -Tags ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Welche Bibliotheken in GO werden von großen Unternehmen oder bekannten Open-Source-Projekten entwickelt? Bei der Programmierung in Go begegnen Entwickler häufig auf einige häufige Bedürfnisse, ...

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Zwei Möglichkeiten, Strukturen in der GO -Sprache zu definieren: Der Unterschied zwischen VAR- und Typ -Schlüsselwörtern. Bei der Definition von Strukturen sieht die Sprache oft zwei verschiedene Schreibweisen: Erstens ...

Go Zeigersyntax und Probleme bei der Verwendung der Viper -Bibliothek bei der Programmierung in Go -Sprache. Es ist entscheidend, die Syntax und Verwendung von Zeigern zu verstehen, insbesondere in ...
