2017-05-04 42 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

相關問題