


Un article vous apprend les bases de la réflexion en langage Go
Qu'est-ce que la réflexion
La réflexion, euh..., ça veut dire inverser, c'est-à-dire retourner les choses.
Par exemple, un code très simple comme celui-ci.
var a int = 3 fmt.Println(a)
Bien sûr que nous le savons a
a
变量是int
类型,但是反过来想,程序是怎么知道a
是int
La variable est int </ code><br/></p> tapez, mais réfléchissez-y dans l'autre sens, comment le programme sait-il <p cid="n11" mdtype="paragraph" style="line-height: inherit;orphans: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;"><span md-inline="plain"><code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px ; style de bordure : solide ; couleur de bordure : rgb (231, 234, 237); couleur d'arrière-plan : rgb (243, 244, 244); rayon de bordure : 3 px; 2px;font-size : 0,9 em;">a
int
En ce moment, vous devez utiliser la réflexion.
Exemple de code
v := reflect.TypeOf(a) fmt.Println(v)
La deuxième ligne de code a modifié avec succès la variable a
a
还原出了int
类型。
什么???你为我有什么用???,嗯。。。实话实说,用的不是太多,但是必须要会的。
反射(reflect包)
在Go中,任何变量,都有具体类型和具体值,就像 Donc, le type spécifique de la variable appartient à 并且Go的提供了 . 🎜 通过 这个是啥意思呢??这个在结构体中比较好体现。 简答来说就是 经过对比,会发现几个特殊问题。 如果变量是指针类型, Si la variable est un type type de référence (tranche et carte), 如果变量是结构体, Si la variable est une structure , 所以 注: 需求:定义一个函数,可以接收任意类型,通过反射得出变量类型和变量值。 反射还有一个用途,就是动态的修改变量值,可能你暂时体会不到,但是语法还是要学的。 通过反射设置值,需要用到 示例代码 , 其中 其中 Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!var a int = 3
,具体类型就是int
,具体值就是3
restauréType spécifique 🎜🎜 est 🎜🎜
int</code >🎜🎜, 🎜<span md-inline="strong"><strong>La valeur spécifique</strong>🎜🎜 est 🎜🎜<code style="font-family: var(--monospace);vertical-align: initial ;border-width : 1px;style de bordure : solide ;couleur de bordure : rgb(231, 234, 237);couleur d'arrière-plan : rgb(243, 244, 244);rayon de bordure : 3px;remplissage à droite : 2px ;rembourrage à gauche : 2px;font-size: 0.9em;">3
🎜🎜. 🎜🎜reflect.Type
reflect.Type
,变量的具体值归属在reflect.Value
。reflect.TypeOf
获取具体类型。reflect.ValueOf
获取具体值。TypeOf
TypeOf
, la valeur spécifique de la variable appartient à reflect.Value
reflect.TypeOf
🎜🎜Obtenez le 🎜🎜🎜type spécifique🎜🎜🎜. 🎜🎜示例代码
函数
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
。Nom
Name
为空,只有Kind
。Name
是结构体名,Kind
是struct
。ValueOf
TypeOf
est vide, seulement Type
. Nom
🎜🎜 est le nom de la structure, 🎜🎜🎜ValueOf🎜</h3><p cid="n56" mdtype="paragraph" style="line-height: hériter; orphelins : 4; marge-haut : 0,8em; marge- bas : 0,8 em ; espace blanc : pré-enveloppement ; famille de polices : "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif ; taille de police : 16 px ; alignement du texte : start;">🎜<code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237 );couleur d'arrière-plan : rgb(243, 244, 244);rayon de bordure : 3 px;padding-right : 2px;padding-left : 2px;taille de police : 0,9em;">TypeOf
🎜🎜uniquement Vous pouvez obtenir le 🎜🎜🎜type spécifique🎜🎜🎜 de la variable à votre tour, mais vous ne pouvez pas obtenir la 🎜🎜🎜valeur spécifique🎜🎜🎜, ce qui est un peu méchant. 🎜🎜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)
}
执行结果
TypeOf
,
TypeOf的Name和Kind
ValueOf
TypeOf
,TypeOf的Name和Kind
,ValueOf
,通过反射设置值
。Kind
在Type
和ValueOf
中都有,通常情况下TypeOf
和ValueOf
,通过反射设置值
Kind
🎜🎜在🎜🎜ValueOf
🎜🎜一起使用效果更佳!🎜 🎜🎜🎜反射这一块,可能不是那么好理解,一定要多多下功夫!坚持!!🎜🎜

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...
