【GO】反射实战案例

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

项目需求

所有商品的都有共性:名字,价钱
自行封装三种商品
随意给一个商品的切片,将每件商品的所有属性信息输出到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文件
在这里插入图片描述

如何实现本文的案例

  • 复制代码到一个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

博主微信欢迎交流

在这里插入图片描述

发布了875 篇原创文章 · 获赞 132 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/fangkang7/article/details/105098379
今日推荐