项目需求
所有商品的都有共性:名字,价钱
自行封装三种商品
随意给一个商品的切片,将每件商品的所有属性信息输出到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