【GO】反射實戰案例

反射實現隨意給一個商品的切片,將每件商品的全部屬性信息輸出到json文件

項目需求

全部商品的都有共性:名字,價錢
自行封裝三種商品
隨意給一個商品的切片,將每件商品的全部屬性信息輸出到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

博主微信歡迎交流

在這裏插入圖片描述

相關文章
相關標籤/搜索