反射

522 字
3 分钟
反射

反射#

pair#

type Reader interface {
Read()
}
type Writer interface {
Write()
}
type Book struct {
Name string
}
func (b *Book) Read() {
fmt.Println("read book:", b.Name)
}
func (b *Book) Write() {
fmt.Println("write book:", b.Name)
}
func main() {
book := &Book{Name: "Go 语言"} // 创建Book对象,name=Go 语言
var r Reader // 多态:Reader r = book
r = book
var r1 Reader = book
r1.Read()
r.Read()
var w Writer
// r = pair<type:*Book, value:Book对象地址>
w, ok := r.(Writer) // 检查 r 里面当前保存的真实类型,是否实现了 Writer 接口
if ok {
w.Write()
} else {
fmt.Println("Book is not have write method")
}
}

reflect#

type User struct {
Name string
Age int
}
func (this *User) Call() {
fmt.Println("User.Call()")
fmt.Printf("%v\n", this)
}
func reflectNum(arg interface{}) {
fmt.Println("reflectNum.type", reflect.TypeOf(arg))
fmt.Println("reflectNum.value", reflect.ValueOf(arg))
}
func DoFileAndMethod(input interface{}) {
// 获取input的type和value
inputType := reflect.TypeOf(input)
inputValue := reflect.ValueOf(input)
inputKind := inputType.Kind()
fmt.Println("input.type:", inputType)
fmt.Println("input.value:", inputValue)
fmt.Println("inputType.Kind():", inputKind)
fmt.Println("reflect.Struct:", reflect.Struct)
// 转成对应type,如User对象
// 遍历input对象
if inputType.Kind() != reflect.Struct {
fmt.Println("input 不是结构体,不能遍历字段")
return
}
for i := 0; i < inputType.NumField(); i++ {
field := inputType.Field(i)
value := inputValue.Field(i).Interface()
fmt.Println("field.Name:", field.Name)
fmt.Println("field.Value:", value)
}
}
func main() {
var num float64 = 23.4351
reflectNum(num)
var user = User{"zhangsan", 20}
reflectNum(user)
DoFileAndMethod(num)
}
--------------
reflectNum.type float64
reflectNum.value 23.4351
reflectNum.type main.User
reflectNum.value {zhangsan 20}
input.type: float64
input.value: 23.4351
inputType.Kind(): float64
reflect.Struct: struct
input 不是结构体,不能遍历字段

Tag#

type Bank struct {
Name string `json:"bank_name" desc:"名称"`
Addr string `json:"bank_addr" desc:"地址"`
}
func findTag(str interface{}) {
tag := reflect.TypeOf(str).Elem()
for i := 0; i < tag.NumField(); i++ {
desc := tag.Field(i).Tag.Get("desc")
json := tag.Field(i).Tag.Get("json")
fmt.Printf("desc:%s, json:%s\n", desc, json)
}
}
func main() {
spdb := Bank{"SPDB", "Shanghai"}
fmt.Println(spdb)
findTag(&spdb)
}
---------------
{SPDB Shanghai}
desc:名称, json:bank_name
desc:地址, json:bank_addr

Tag应用#

type Movie struct {
Title string `json:"title"`
Year int `json:"year"`
Price float32 `json:"price"`
Actors []string `json:"actors"`
}
func main() {
movie := Movie{"喜剧之王", 2000, 190000, []string{"zhangsan", "lisi"}}
jsonStr, err := json.Marshal(movie)
if err != nil {
fmt.Println("json.Marshal error", err)
return
}
fmt.Printf("jsonStr = %s", jsonStr)
}
---------------------------
jsonStr= {"title":"喜剧之王","year":2000,"price":190000,"actors":["zhangsan","lisi"]}
type Movie struct {
Title string `json:"title"`
Year int `json:"year"`
Price float32 `json:"price"`
Actors []string `json:"actors"`
}
func main() {
movie := Movie{"喜剧之王", 2000, 190000, []string{"zhangsan", "lisi"}}
fmt.Println(movie)
jsonStr, err := json.Marshal(movie)
if err != nil {
fmt.Println("json.Marshal error", err)
return
}
fmt.Printf("jsonStr = %s\n", jsonStr)
// jsonStr转回结构体,赋值给myMovie
myMovie := Movie{}
err = json.Unmarshal(jsonStr, &myMovie)
if err != nil {
fmt.Println("json.Unmarshal error", err)
return
}
fmt.Printf("myMovie = %v\n", myMovie)
}
------------------
{喜剧之王 2000 190000 [zhangsan lisi]}
jsonStr = {"title":"喜剧之王","year":2000,"price":190000,"actors":["zhangsan","lisi"]}
myMovie = {喜剧之王 2000 190000 [zhang

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

反射
https://shaio.top/posts/丫丫学语/golang/反射/
作者
沙海
发布于
2026-08-10
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
沙海
Hello, I'm Shai.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
84
分类
15
标签
48
总字数
67,035
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.12.2
文章许可
CC BY-NC-SA 4.0

文章目录