使用Reflection设置字段

时间:2017-09-15 08:37:13

标签: go

我正在努力使用Go lang代码几天。我有一个golang函数,可以在struct中设置所有常见字段,如createdBy,updatedBy等。我已经google了很多,并提出了以下代码。

package main

import (
    "fmt"
    "reflect"
    "time"
    "strings"
)
type User struct {
    UserId         string         `json:"userId"`
    ObjectType         string         `json:"objectType"`
    CreationDate       string         `json:"creationDate"`
    UpdationDate       string         `json:"updationDate"`
    Version            int            `json:"version"`         
}
func main() {
    //fmt.Println("Hello, playground")
    var user = User{}
    var k = setCommonParam(&user )
    var p = k.(*User)
    fmt.Println(p.CreationDate)
    var l = *p
    fmt.Println(l.ObjectType)
    fmt.Println(reflect.TypeOf(k))
    fmt.Println(reflect.TypeOf(user))

}

func setCommonParam(obj interface{}) (interface{}) {
    entityValue := reflect.ValueOf(obj).Elem()
    entityType := entityValue.Type()

    for i:=0; i<entityValue.NumField(); i++ {
        typeField := entityType.Field(i)
        vField := entityValue.Field(i)

        if typeField.Name == "ObjectType" {
            vField.SetString(strings.ToLower(reflect.TypeOf(obj).Elem().Name()))
        } else if typeField.Name == "CreationDate" {    
            vField.SetString(time.Now().Format(time.RFC3339))   
        } else if typeField.Name == "UpdationDate" {
            vField.SetString(time.Now().Format(time.RFC3339))
        } else if typeField.Name == "CreatedBy" {

        } else if typeField.Name == "UpdatedBy" {

        } else if typeField.Name == "Version" {

        }
    }
    return obj
}

有什么方法可以在一行中写下以下内容吗?

var k = setCommonParam(&user )
var p = k.(*User)
var l = *p

并做这样的事情:

user = setCommonParam(user)

我很抱歉,但我是新手。感谢。

1 个答案:

答案 0 :(得分:0)

如果您的问题是“如何将这3行压缩成一个?”,那么答案是:

var l = *(setCommonParam(&user).(*User))