1 回答
TA贡献1827条经验 获得超8个赞
使用Reflect包以编程方式设置字段。
必须导出一个字段才能由反射包设置。通过将名称中的第一个符文大写来导出名称:
type HDR struct {
Typer, A string
B int
}
type BDY struct {
Typer, C string
D int
E string
}
创建名称到与名称关联的类型的映射:
var types = map[string]reflect.Type{
"HDR": reflect.TypeOf((*HDR)(nil)).Elem(),
"BDY": reflect.TypeOf((*BDY)(nil)).Elem(),
}
对于每一行,使用映射创建一个类型的值types:
for _, l := range strings.Split(lines, "\n") {
fields := strings.Split(l, "~")
t := types[fields[0]]
v := reflect.New(t).Elem()
...
}
循环遍历该行中的字段。获取字段值,将字符串转换为字段值的种类并设置字段值:
for i, f := range fields {
fv := v.Field(i)
switch fv.Type().Kind() {
case reflect.String:
fv.SetString(f)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
n, _ := strconv.ParseInt(f, 10, fv.Type().Bits())
fv.SetInt(n)
}
}
这是该方法的基本轮廓。错误处理值得注意:如果类型名称不是中提到的类型之一,应用程序将出现恐慌types;应用程序忽略解析整数返回的错误;如果数据中的字段多于结构体,应用程序将会出现恐慌;当应用程序遇到不支持的字段类型时,不会报告错误;和更多。
- 1 回答
- 0 关注
- 130 浏览
添加回答
举报