当前位置: 首页 > 面试题库 >

更新字段,如果值是nil,0,在struct golang中为false?

谢飞舟
2023-03-14
问题内容

我有一个结构:

type User struct {
   ID       int    `json:"id"`
   Username string `json:"username"`
   About    string `json:"about"`
   IsAdmin  bool   `json:"is_admin"`
   Status   int    `json:"status"`
   ......
}
A:= User{1,"admin", "I am a admin",status: 1,....}
B:= User{ID:1, Username: "UserBBBB"}
...enter code here...
B is {1, "UserBBBB", "I am a admin", 1, ...(same value in A)}

对象B具有一些属性,分别为nil(字符串),false(布尔),0(整数),…。我想检查B的字段是否为未分配值,该字段将接收A中相同字段的值,

例:

B的关于字段为零;

A的“关于”字段是“我是管理员”。B的“关于”字段是“我是管理员”。

我可以写代码:

if len(B.About) == 0 {
  B.About = A.About

与其他字段类似,我不想逐步检查所有字段。


问题答案:
package main

import (
    "errors"
    "fmt"
    "log"
    "reflect"
    "time"
)

type User struct {
    ID       int    `json:"id"`
    Username string `json:"username"`
    About    string `json:"about"`
    IsAdmin  bool   `json:"is_admin"`
    Status   int    `json:"status"`
    Date     *time.Time
}

func main() {
    now := time.Now()
    ua := User{
        ID:       1,
        Username: "admin",
        About:    "I am an admin",
        IsAdmin:  true,
        Status:   1,
        Date:     &now,
    }
    ub := User{
        Username: "user",
    }

    fmt.Printf("ua: %+v\n", ua)
    fmt.Printf("ub: %+v\n", ub)

    err := Replace(ua, &ub)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("\nua: %+v\n", ua)
    fmt.Printf("ub: %+v\n", ub)
}

// IsZeroOfUnderlyingType return wether x is the is
// the zero-value of its underlying type.
func IsZeroOfUnderlyingType(x interface{}) bool {
    return reflect.DeepEqual(x, reflect.Zero(reflect.TypeOf(x)).Interface())
}

// Replace replaces all fields of struct b that have a
// zero-value with the corresponding field value from a.
// b must be a pointer to a struct.
func Replace(a, b interface{}) error {
    // Check a.
    va := reflect.ValueOf(a)
    if va.Kind() != reflect.Struct {
        return errors.New("a is not a struct")
    }
    // Check b.
    vb := reflect.ValueOf(b)
    if vb.Kind() != reflect.Ptr {
        return errors.New("b is not a pointer")
    }
    // vb is a pointer, indirect it to get the
    // underlying value, and make sure it is a struct.
    vb = vb.Elem()
    if vb.Kind() != reflect.Struct {
        return errors.New("b is not a struct")
    }
    for i := 0; i < vb.NumField(); i++ {
        field := vb.Field(i)
        if field.CanInterface() && IsZeroOfUnderlyingType(field.Interface()) {
            // This field have a zero-value.
            // Search in a for a field with the same name.
            name := vb.Type().Field(i).Name
            fa := va.FieldByName(name)
            if fa.IsValid() {
                // Field with name was found in struct a,
                // assign its value to the field in b.
                if field.CanSet() {
                    field.Set(fa)
                }
            }
        }
    }
    return nil
}

输出量

ua: {ID:1 Username:admin About:I am an admin IsAdmin:true Status:1 Date:2017-05-11 17:47:30.805657327 +0200 CEST}
ub: {ID:0 Username:user About: IsAdmin:false Status:0 Date:<nil>}

ua: {ID:1 Username:admin About:I am an admin IsAdmin:true Status:1 Date:2017-05-11 17:47:30.805657327 +0200 CEST}
ub: {ID:1 Username:user About:I am an admin IsAdmin:true Status:1 Date:2017-05-11 17:47:30.805657327 +0200 CEST}


 类似资料:
  • 本文向大家介绍如果在MySQL中为空,如何使用特定值更新字段?,包括了如果在MySQL中为空,如何使用特定值更新字段?的使用技巧和注意事项,需要的朋友参考一下 要更新字段为空,请使用IS NULL属性和UPDATE命令。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是查询以更新字段(如果该字段在MySQL中为空)- 让我

  • 只有当新值不为null时,我才会更新集合设置值。我有这样一个代码: 有没有一个简单的方法可以做到这一点? 另一种方法:如果我可以从我获取数据的表单的占位符中获取值,我可以解决这个问题...但是这可能吗?

  • 我有一个题目里提到的问题。 输入字段的类型为Number。 th:字段引用数据库中的int属性。 我希望我的占位符是可见的,而不是默认的0值。

  • 问题内容: 在MySQL中,是否可以将“总计”字段设置为零(如果它们为NULL)? 这是我所拥有的: 数据输出正常,但NULL字段应为。 如何在MySQL中为NULL返回0? 问题答案: 使用IFNULL: 从文档中: 如果expr1不为NULL,则IFNULL()返回expr1; 否则返回expr2。IFNULL()返回数字或字符串值,具体取决于使用它的上下文。

  • 问题内容: 我在Access中创建了一个查找表,以提供列的可能值。现在,我需要使用转换列之前的数据来更新此列。我无法弄清楚将运行的SQL查询。我不断收到错误消息“ UPDATE或DELETE查询不能包含多值字段。” 我的研究表明,我只需要设置列的值,但这总是更新0条记录: 我知道如果更改它以更新文本列,此查询将起作用,因此仅此列绝对是一个问题。 问题答案: 如果要将值添加到多值字段,请使用追加查询

  • 我的团队在DynamoDB中添加了一个新字段,我需要为当前不包含该字段的所有条目添加一个整数。 我尝试在这里使用Update示例,但是我得到了一个,因为我的子句不包括主键。但是,我不需要按主键过滤,因为我只关心没有新列值的条目。 我正在运行的查询是PartiQL,它是: