2017-09-15 74 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))