Go 为结构中的字段赋值(如果为空)

Go 为结构中的字段赋值(如果为空),go,Go,我定义了一个结构 type data struct { invitecode string fname string lname string } 我通过解析后检索表单数据来填充它 ... r.ParseForm() new user := &data{ invitecode: r.FormValue("invitecode"), fname: r.FormValue("fname") lname: r.FormValue("lname") } 我确实想检

我定义了一个结构

type data struct {
  invitecode string
  fname string
  lname string
}
我通过解析后检索表单数据来填充它

...

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没有一个十进制运算符,我想使用它来阅读问题,这意味着使用if-else语句,但我似乎无法让它工作。更可取的是,我正在寻找一个解决方案,在分配一个新变量时进行检查。尝试下面的代码似乎不起作用。任何帮助都将不胜感激

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)
}

如果。。。else语句内联就像您在其他语言中使用三元运算符(或if/else语句)一样,您只需按程序执行即可:

user := &data{ /* ... */ }

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

Go没有ternaries,也不能像代码中显示的那样进行内联
if
。如果出现以下情况,则必须执行正常的

user = &data{}
if newUser.inviteCode = "" {
    user.invitecode = "Mr"
} else {
    user.invitecode = lnames.title
}
等等。您可以将其提取到函数中:

func coalesce(args ...string) string {
    for _,str := range args {
        if str != "" {
            return str
        }
    }
    return ""
}
并像这样使用它:

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

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

使用
if
语句是否有问题?您引用的代码中没有任何内容试图执行您所描述的操作。我更新了问题以显示我正在尝试执行的操作Hanks,尝试一次性分配所有字段,其他字段可以分配到else块中吗?这是正确的方法吗?当然,如果这是您正在寻找的行为。是的,似乎围棋是为清晰而设计的,而不是为了简洁。没有“似乎”,围棋是以这种方式明确设计的。该语言的开发人员在他们的各种博客中多次提到Go错误处理。他们的观点非常明确和公开,即清晰>简洁。