关于go:如果为空,则将值分配给struct中的字段


Assign value to field in struct if empty

我定义了一个结构

1
2
3
4
5
type data struct {
  invitecode string
  fname string
  lname string
}

在解析后从检索表单数据中填充

1
2
3
4
5
6
7
8
9
...

r.ParseForm()

new user := &data{
  invitecode: r.FormValue("invitecode"),
  fname: r.FormValue("fname")
  lname: r.FormValue("lname")
}

我想检查从表单中获得的invitecode字段是否为空,如果为空,则通过调用函数来填充它,如果不是,则使用检索到的值来填充它(invitecode:if newuser.invitecode==""mr"else lnames.title,)。我知道Go没有一个Tenary运算符,我想在这里、这里、这里和这里使用和阅读问题,这意味着使用if-else语句,但我似乎无法使它工作。更可取的是,我正在寻找一个在分配新变量时进行检查的解决方案。尝试下面的代码似乎不起作用。任何帮助都将不胜感激。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
   "fmt"
)

type data struct {
    invitecode string
    fname      string
    lname      string
}

func main() {
    var user data

    newUser := map[string]string{"invitecode":"","fname":"Dude","lname":"Did"}
    user = &data{
        invitecode: if newUser.invitecode =="" {"Mr"} else {lnames.title},
        fname:      newUser.fname,
        lname:      newUser.lname,
    }
    fmt.Println(user)
}


go没有三元,也不能像代码中显示的那样执行内联if。您必须执行一个正常的if块:

1
2
3
4
5
6
user = &data{}
if newUser.inviteCode ="" {
    user.invitecode ="Mr"
} else {
    user.invitecode = lnames.title
}

等等。您可以将其提取到一个函数中:

1
2
3
4
5
6
7
8
func coalesce(args ...string) string {
    for _,str := range args {
        if str !="" {
            return str
        }
    }
    return""
}

像这样使用它:

1
user.invitecode = coalesce(lnames.title,"Mr")

当然,如果处理多个类型(不仅仅是字符串),那么每种类型都需要一个这样的函数。


您不能像在其他语言中使用三元运算符(或if/else语句)那样使用内联的if ... else语句,您只需按程序执行即可:

1
2
3
4
5
6
7
user := &data{ /* ... */ }

if user.invitecode =="" {
  user.invitecode ="Mr"
} else {
  user.invitecode = lnames.title
}