240
世界上有10种人,一种懂二进制,另一种不懂二进制。

遍历切片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

  

  

 

posted @   unionline  阅读(1617)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
点击右上角即可分享
微信分享提示