可以在golang使用质量分配吗?

可以在golang使用质量分配吗?,go,struct,types,variable-assignment,mass-assignment,Go,Struct,Types,Variable Assignment,Mass Assignment,我的结构如下所示: type User struct { Id uint64 Email string } user := User{ Id: 1, Email: "test@example.com", } user.Id = 2 user.Email = "test1@example.com" 我知道,我可以这样声明: type User struct { Id uint64 Email string } user := User{

我的结构如下所示:

type User struct {
    Id uint64
    Email string
}
user := User{
    Id: 1,
    Email: "test@example.com",
}
user.Id = 2
user.Email = "test1@example.com"
我知道,我可以这样声明:

type User struct {
    Id uint64
    Email string
}
user := User{
    Id: 1,
    Email: "test@example.com",
}
user.Id = 2
user.Email = "test1@example.com"
我可以这样更新它:

type User struct {
    Id uint64
    Email string
}
user := User{
    Id: 1,
    Email: "test@example.com",
}
user.Id = 2
user.Email = "test1@example.com"

是否可以使用类似的构造,如用于创建但用于更新结构?

不,实际上没有等效的多属性设置器

编辑:

可能通过反射,您可以执行以下操作:

updates := user := User{
  Email: "newemail@example.com",
}
//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{})
,但我通常认为这种复杂性不值得节省。只需要一行一行地设置字段。

不,实际上没有等效的多属性设置器

编辑:

可能通过反射,您可以执行以下操作:

updates := user := User{
  Email: "newemail@example.com",
}
//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{})
,但我通常认为这种复杂性不值得节省。只要有几行设置字段就可以了。

你的意思是这样吗

package main

import (
    "fmt"
)

type User struct {
    Id    uint64
    Email string
}

func main() {
    user := User{
        Id:    1,
        Email: "test@example.com",
    }
    fmt.Println(user)

    user = User{
        Id:    2,
        Email: "also-test@example.com",
    }
    fmt.Println(user)
}
你是说像这样吗

package main

import (
    "fmt"
)

type User struct {
    Id    uint64
    Email string
}

func main() {
    user := User{
        Id:    1,
        Email: "test@example.com",
    }
    fmt.Println(user)

    user = User{
        Id:    2,
        Email: "also-test@example.com",
    }
    fmt.Println(user)
}

这不一样,但您可以使用多值返回功能在一行中设置它们


这不一样,但是您可以使用多值返回功能在一行中设置它们


这可以通过反思来实现吗?例如,我有一个应该更新的字段列表,需要扔掉它并做一些事情。谢谢。我知道,它很难看,我真的不喜欢它。这是因为,我不知道如何避免它可以通过反思来实现吗?例如,我有一个应该更新的字段列表,需要扔掉它并做一些事情。谢谢。我知道,它很难看,我真的不喜欢它。这是因为,我不知道如何避免它。如果你添加
Name:user1.Name
@OleksandrSavchenko,你可以这样做吗?这不是你添加
Name:user1.Name
@OleksandrSavchenko时所能做的事情吗?这不是你的问题!看起来不错,但是对于很多属性来说,它看起来很难看。你可以用一个函数来包装它。谢谢!看起来不错,但对于许多属性来说,它看起来很糟糕。您可以将其包装在函数中