遍历切片slice,结构体struct,映射map,interface{}的属性和值
1 前言
说明:interface{}必须是前三者类型
2 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | /** * @Author: FB * @Description: * @File: testOutput.go * @Version: 1.0.0 * @Date: 2019/6/3 10:38 */ package main import ( "reflect" "fmt" ) type NotknownType struct { s1, s2, s3 string } type NotknownType2 struct { S1, S2, S3 string } //只输出值且属性名小写 func output11(obj NotknownType){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf( "Field %d: %v\n" , i, value.Field(i)) } } //只输出属性和值且属性名小写 func output12(obj NotknownType){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->" , value.Field(i).Interface()) } } //只输出值且属性名大写 func output21(obj NotknownType2){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf( "Field %d: %v\n" , i, value.Field(i)) } } //只输出属性和值且属性名大写 func output22(obj NotknownType2){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->" , value.Field(i).Interface()) } } //只输出属性和值且属性名大写 func output221(obj NotknownType2){ fmt.Printf( "%+v" ,obj) fmt.Println() } //以下是参数为interface{},和上面四个其它一一对应 func output110(obj interface {}){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf( "Field %d: %v\n" , i, value.Field(i)) } } func output120(obj interface {}){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->" , value.Field(i).Interface()) } } func output210(obj interface {}){ value := reflect.ValueOf(obj) for i := 0; i < value.NumField(); i++ { fmt.Printf( "Field %d: %v\n" , i, value.Field(i)) } } func output220(obj interface {}){ value := reflect.ValueOf(obj) t := reflect.TypeOf(obj) for i := 0; i < t.NumField(); i++ { fmt.Println(t.Field(i).Name, "->" , value.Field(i).Interface()) } } func main() { var secret = NotknownType{ "Ada" , "Go" , "Oberon" } var secret2 = NotknownType2{ "Ada" , "Go" , "Oberon" } var map1 = map [string]string{ "s1" : "Ada" , "s2" : "Go" , "s3" : "Oberon" } var slice1 = []string{ "Ada" , "Go" , "Oberon" } var obj interface {} = NotknownType{ "Ada" , "Go" , "Oberon" } var obj2 interface {} = NotknownType2{ "Ada" , "Go" , "Oberon" } //参数是struct fmt.Println( "output11只输出值且属性名小写" ) output11(secret) //报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值 //fmt.Println("output12") //output12(secret) fmt.Println( "output21只输出值且属性名大写" ) output21(secret2) fmt.Println( "output22只输出属性和值且属性名大写" ) output22(secret2) fmt.Println() fmt.Println( "output221" ) output221(secret) fmt.Println( "output222" ) output222(secret2) fmt.Println() //参数是interface{} fmt.Println( "output110只输出值且属性名小写,参数为interface{}" ) output110(obj) //报错panic: reflect.Value.Interface: cannot return value obtained from unexported field or method,因为属性是小写,反射拿不到值 //fmt.Println("output120") //output120(obj) fmt.Println( "output210只输出值且属性名大写,参数为interface{}" ) output210(obj2) fmt.Println( "output220只输出属性和值且属性名大写,参数为interface{}" ) output220(obj2) //报错panic: reflect: NumField of non-struct type //output220(map1) fmt.Println( "output220 只输出属性和值且属性名大写,输入为struct属性大写" ) output220(secret2) fmt.Println( "遍历map,输出键和值" ) //输出map键和值 for k,v := range map1{ fmt.Println(k, "->" ,v) } fmt.Println( "遍历slice,输出值" ) //输出map键和值 for i, v := range slice1{ fmt.Println(i, "->" , v) } } |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | output11只输出值且属性名小写 Field 0: Ada Field 1: Go Field 2: Oberon output21只输出值且属性名大写 Field 0: Ada Field 1: Go Field 2: Oberon output22只输出属性和值且属性名大写 S1 -> Ada S2 -> Go S3 -> Oberon output221 {s1:Ada s2:Go s3:Oberon} output222 {S1:Ada S2:Go S3:Oberon} output110只输出值且属性名小写,参数为 interface {} Field 0: Ada Field 1: Go Field 2: Oberon output210只输出值且属性名大写,参数为 interface {} Field 0: Ada Field 1: Go Field 2: Oberon output220只输出属性和值且属性名大写,参数为 interface {} S1 -> Ada S2 -> Go S3 -> Oberon output220 只输出属性和值且属性名大写,输入为 struct 属性大写 S1 -> Ada S2 -> Go S3 -> Oberon 遍历 map ,输出键和值 s1 -> Ada s2 -> Go s3 -> Oberon 遍历slice,输出值 0 -> Ada 1 -> Go 2 -> Oberon Debugger finished with exit code 0 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战