2017-09-15 91 views
1

我正在努力使用一些Go lang代码几天。我有一个golang函数,可以在结构中设置像createdBy,updatedBy等所有常用字段。我搜索了很多,并提出了以下代码。使用反射设置字段

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) 

我很抱歉,我是新来这个。谢谢。

回答

0

如果你的问题是“怎么样?这3个行凝结成一个”,那么答案是:

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