将 reflect.Value 设置为 Go 中的切片

huangapple go评论79阅读模式
英文:

Set reflect.Value to slice in Go

问题

我尝试保存一个整数字段的切片。该字段的类型是reflect.Value。

我遇到了错误:无法将articles(类型为[]int64的变量)作为参数传递给field.Set中的reflect.Value值。我该怎么解决这个问题?

非常感谢!

for i := 0; i < elem.Type().NumField(); i++ {
    structField := elem.Type().Field(i)

    tag := structField.Tag.Get("db")
    fieldType := structField.Type
    fieldName := structField.Name
    val, ok := record.Get(fmt.Sprintf("%s", tag))
    if ok {
        // 忽略空值
        if val == nil {
            continue
        }
        field := elem.FieldByName(fieldName)
        if field.IsValid() {
            t := fieldType.String()
            switch t {
            case "string":
                field.SetString(val.(string))
            case "int64":
                field.SetInt(val.(int64))
            case "float64":
                field.SetFloat(val.(float64))
            case "boolean":
                field.SetBool(val.(bool))
            case "[]int64":
                articles := []int64{}
                initData := []interface{}{
                    val,
                }
                for _, data := range initData {
                    for _, v := range data.([]interface{}) {
                        t := v
                        articles = append(articles, t.(int64))
                    }
                }
                //
                field.Set(articles)
            default:
                return fmt.Errorf("Invalid type: %s", t)
            }

        }
    }
}

将 reflect.Value 设置为 Go 中的切片

英文:

I try to save a slice of integers of a field. the field is type reflect.Value.

I get the error: cannot use articles (variable of type []int64) as reflect.Value value in argument to field.Set. What can I do to encounter that?

Thank you very much!

for i := 0; i &lt; elem.Type().NumField(); i++ {
		structField := elem.Type().Field(i)

		tag := structField.Tag.Get(&quot;db&quot;)
		fieldType := structField.Type
		fieldName := structField.Name
		val, ok := record.Get(fmt.Sprintf(&quot;%s&quot;, tag))
		if ok {
			// Ignore nil values
			if val == nil {
				continue
			}
			field := elem.FieldByName(fieldName)
			if field.IsValid() {
				t := fieldType.String()
				switch t {
				case &quot;string&quot;:
					field.SetString(val.(string))
				case &quot;int64&quot;:
					field.SetInt(val.(int64))
				case &quot;float64&quot;:
					field.SetFloat(val.(float64))
				case &quot;boolean&quot;:
					field.SetBool(val.(bool))
				case &quot;[]int64&quot;:
					articles := []int64{}
					initData := []interface{}{
						val,
					}
					for _, data := range initData {
						for _, v := range data.([]interface{}) {
							t := v
							articles = append(articles, t.(int64))
						}
					}
					//
					field.Set(articles)
				default:
					return fmt.Errorf(&quot;Invalid type: %s&quot;, t)
				}

			}
		}

将 reflect.Value 设置为 Go 中的切片

答案1

得分: 1

mkopriva的答案是:field.Set(reflect.ValueOf(articles))

英文:

The answer of mkopriva: field.Set(reflect.ValueOf(articles))

huangapple
  • 本文由 发表于 2022年6月25日 18:27:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/72753091.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定