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