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") } |
我想检查从表单中获得的
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没有三元,也不能像代码中显示的那样执行内联
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语句)那样使用内联的
1 2 3 4 5 6 7 | user := &data{ /* ... */ } if user.invitecode =="" { user.invitecode ="Mr" } else { user.invitecode = lnames.title } |