gpt4 book ai didi

go - 如何使用变量访问结构?

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:34 25 4
gpt4 key购买 nike

我是 Go 新手,在访问带有变量的结构时遇到问题

我有这个函数decodeUser。我的任务是检查请求中是否存在 key 。所以这就是我所做的。我在出现错误的地方添加了评论。

func decodeUser(r *http.Request) (root.User, []string, error) {
var u root.User
if r.Body == nil {
return u, []string{}, errors.New("no request body")
}
decoder := json.NewDecoder(r.Body)
checks := []string{
"UserName",
"FirstName",
"LastName",
"Email",
}
emptyFields := []string{}
for _, check := range checks {
// i'm having problem over here `u[check]` it's showing (invalid
operation: u[check] (type root.User does not support
indexing))
if u[check] == nil {
emptyFields = append(emptyFields, check)
}
}
err := decoder.Decode(&u)
return u, emptyFields, err
}

以防万一我添加了 root.User 这是它的结构

type User struct {
ID string
Username string
Password string
FirstName string
LastName string
Email string
PhoneNumber string
PhoneNumberExtension string
DOB time.Time
AboutMe string
}

出现问题是因为它不允许我通过变量访问结构,而且我不能使用 u.check 这个方法。所以基本上我应该如何使 u[check] 工作

最佳答案

我建议您手动检查零值,因为您似乎已经知道在编译时需要非零的字段。但是,如果不是这种情况,这里有一个简单的函数(使用反射),它将检查结构中的零值。

func zeroFields(v interface{}, fields ...string) []string {

val := reflect.Indirect(reflect.ValueOf(v))
if val.Kind() != reflect.Struct {
return nil
}

var zeroes []string

for _, name := range fields {

field := val.FieldByName(name)

if !field.IsValid() {
continue
}

zero := reflect.Zero(field.Type())
// check for zero value
if reflect.DeepEqual(zero.Interface(), field.Interface()) {
zeroes = append(zeroes, name)
}

}

return zeroes
}

func main() {

x := User{
Email: "not@nil",
}

fmt.Println(zeroFields(&x, "ID", "Username", "Email", "Something", "DOB"))
}

哪个会输出:

[ID Username DOB]

Playground

关于go - 如何使用变量访问结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53457231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com