Iterate Over String Fields in Struct

后端 未结 3 555
夕颜
夕颜 2020-12-28 11:58

I\'m looking to iterate over the string fields of a struct so I can do some clean-up/validation (with strings.TrimSpace, strings.Trim, etc).

<
3条回答
  •  春和景丽
    2020-12-28 12:13

    I don't know if it's a good way, but I use it like this.

    https://play.golang.org/p/aQ_hG2BYmMD

    You can send the address of a struct to this function. Sorry for My English is not very good.

    trimStruct(&someStruct)
    
    func trimStruct(v interface{}) {
        bytes, err := json.Marshal(v)
        if err != nil {
            fmt.Println("[trimStruct] Marshal Error :", err)
        }
        var mapSI map[string]interface{}
        if err := json.Unmarshal(bytes, &mapSI); err != nil {
            fmt.Println("[trimStruct] Unmarshal to byte Error :", err)
        }
        mapSI = trimMapStringInterface(mapSI).(map[string]interface{})
        bytes2, err := json.Marshal(mapSI)
        if err != nil {
            fmt.Println("[trimStruct] Marshal Error :", err)
        }
        if err := json.Unmarshal(bytes2, v); err != nil {
            fmt.Println("[trimStruct] Unmarshal to b Error :", err)
        }
    }
    
    func trimMapStringInterface(data interface{}) interface{} {
        if values, valid := data.([]interface{}); valid {
            for i := range values {
                data.([]interface{})[i] = trimMapStringInterface(values[i])
            }
        } else if values, valid := data.(map[string]interface{}); valid {
            for k, v := range values {
                data.(map[string]interface{})[k] = trimMapStringInterface(v)
            }
        } else if value, valid := data.(string); valid {
            data = strings.TrimSpace(value)
        }
        return data
    }
    

提交回复
热议问题