【GO】反射实战案例

简介: 【GO】反射实战案例

项目需求

所有商品的都有共性:名字,价钱

自行封装三种商品

随意给一个商品的切片,将每件商品的所有属性信息输出到json文件

使用反射实现

案例源码

package main
import (
  "encoding/json"
  "fmt"
  "os"
  "reflect"
)
/**
所有商品的都有共性:名字,价钱
自行封装三种商品
随意给一个商品的切片,将每件商品的所有属性信息输出到json文件
使用反射实现
*/
/**
定义的父类  名字  价钱
*/
//type Product struct {
//  Name  string
//  price float64
//}
type Computer struct {
  Name  string
  Price float64
  Cpu   string
  // 内存
  Memory int
  // 磁盘
  Disk int
}
type TShirt struct {
  Name  string
  Price float64
  Color string
  Size  int
  Sex   bool
}
type Car struct {
  Name  string
  Price float64
  // 容量
  Cap   int
  Power string
}
func main() {
  // 定义一个可以存储任意类型的空切片
  products := make([]interface{}, 0)
  products = append(products, Computer{"未来人类", 100, "英特尔", 16, 100})
  products = append(products, TShirt{"衣服", 1000, "红色", 16, true})
  products = append(products, Car{"车子", 100, 6, "油电混动"})
  for _, p := range products {
    // 获取p对象的type和value
    pType := reflect.TypeOf(p)
    pValue := reflect.ValueOf(p)
    // 构造属性名和属性值的字典
    fileNameValueMap := make(map[string]interface{})
    // 从type中拿到所有属性名
    for i := 0; i < pType.NumField(); i++ {
      // 获取到所有的属性名
      fieldName := pType.Field(i).Name
      // 全部复制为nil
      fileNameValueMap[fieldName] = nil
    }
    // 从value中根据属性名拿到所有的属性值
    for fieldName, _ := range fileNameValueMap {
      // 返回的是一个反射值,我们需要使用interface来转为正射
      // 返回的是属性的值
      filedValue := pValue.FieldByName(fieldName).Interface()
      // 然后把属性名和属性值对应上
      fileNameValueMap[fieldName] = filedValue
    }
    fileName := "C:/Users/Administrator/Desktop/go/反射/" + fileNameValueMap["Name"].(string) + ".json"
    err := EncodeMapToJsonFile(fileNameValueMap, fileName)
    if err != nil {
      fmt.Println("写出失败")
    } else {
      fmt.Println("写出成功")
    }
  }
}
/**
写入json文件
*/
func EncodeMapToJsonFile(dataMpa map[string]interface{}, filename string) error {
  file, _ := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 666)
  defer file.Close()
  encoder := json.NewEncoder(file)
  err := encoder.Encode(dataMpa)
  return err
}

案例实现后的结果


会生成三个json文件

image.png


如何实现本文的案例


复制代码到一个go文件

修改json文件保存的路径(C:/Users/Administrator/Desktop/go/反射/)改成自己的路径

本案例的知识点


reflect.TypeOf()获取的是对象的类型

reflect.ValueOf() 获取的是值

NumField 获取属性的个数

Field(i).Name 获取第i个属性名

pValue.FieldByName(fieldName).Interface() 这里需要注意一下,这个FieldByName返回的是一个反射值,我们需要使用interface来转为正射

fileNameValueMap[“Name”].(string) 本是一个interface类型使用类型断言为string


相关文章
|
16天前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
6天前
|
Go
Go to Learn Go之反射
Go to Learn Go之反射
25 8
|
29天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
2月前
|
消息中间件 缓存 Kafka
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
|
2月前
|
缓存 NoSQL Redis
go-zero微服务实战系列(七、请求量这么高该如何优化)
go-zero微服务实战系列(七、请求量这么高该如何优化)
|
2月前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)
|
2月前
|
消息中间件 NoSQL Kafka
go-zero微服务实战系列(九、极致优化秒杀性能)
go-zero微服务实战系列(九、极致优化秒杀性能)
|
7天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
17 1
|
6天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
7天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
下一篇
无影云桌面