2017-05-04 43 views

回答

1

不,确实没有一个等效的多属性设置器。

编辑:

与反射,你可以这样做

可能:

updates := user := User{ 
    Email: "[email protected]", 
} 
//via reflection (pseudo code) 
for each field in target object { 
    if updates.field is not zero value{ 
    set target.field = updates.field 
    } 
} 

反射部分可以被分解成一个功能updateFields(dst, src interface{}),但我一般会说复杂是不值得的储蓄。只需要逐行设置几行字段即可。

+0

可以将它与反思做什么?例如,我有应该更新的领域列表,需要扔掉它,做一些东西 –

+1

当然,但它会是丑陋的。请参阅编辑。 – captncraig

+0

谢谢。我知道,这很丑,我真的不喜欢它。这是因为https://github.com/astaxie/beego/issues/2602,我不知道如何避免它 –

0

你的意思是这样吗?

package main 

import (
    "fmt" 
) 

type User struct { 
    Id uint64 
    Email string 
} 

func main() { 
    user := User{ 
     Id: 1, 
     Email: "[email protected]", 
    } 
    fmt.Println(user) 

    user = User{ 
     Id: 2, 
     Email: "[email protected]", 
    } 
    fmt.Println(user) 
} 

https://play.golang.org/p/5-ME3p_JaV

+0

不,我期待这样的https://play.golang.org/p/wwANZM76JB –

+0

你可以这样做,如果你添加了'Name:user1.Name' @OleksandrSavchenko? – Carpetsmoker

+0

这是不一样的 –

1

这是不一样的,但是你可以使用多值回功能,设定成一条线。

https://play.golang.org/p/SGuOhdJieW

package main 

import (
    "fmt" 
) 

type User struct { 
    Id uint64 
    Email string 
Name string 
} 

func main() { 
    user := User{ 
     Id: 1, 
     Email: "[email protected]", 
    Name: "Peter", 
    } 
    fmt.Println(user) 

    user.Id, user.Email = 2, "[email protected]" 
    fmt.Println(user) // user.Name = "Peter" 

} 
+0

谢谢!看起来不错,但是对于很多属性,它看起来很丑陋 –

+0

你可以将它包装在一个函数中 – RayfenWindspear

相关问题