如何以优雅的方式检查多个字符串是否为空?这就是我目前的做法:
//if one required field is empty, close the connection
if (registerRequest.Email == "") ||
(registerRequest.PhoneNumber == "")||
(registerRequest.NachName =="") ||
(registerRequest.VorName =="") ||
(registerRequest.Password =="") ||
(registerRequest.VerificationId ==""){
//Could not proceed
w.WriteHeader(UNABLE_TO_PROCEED)
w.Write([]byte("Unable to register account."))
return
}
答案 0 :(得分:8)
注意:如果你保持"有效"你可以使用下面的解决方案。处理程序中的条件,以及将条件分成另一个函数或方法的情况。
您可以创建一个简单的辅助函数,它具有可变参数,您可以使用任意数量的string
值来调用它:
func containsEmpty(ss ...string) bool {
for _, s := range ss {
if s == "" {
return true
}
}
return false
}
使用它的示例:
if containsEmpty("one", "two", "") {
fmt.Println("One is empty!")
} else {
fmt.Println("All is non-empty.")
}
if containsEmpty("one", "two", "three") {
fmt.Println("One is empty!")
} else {
fmt.Println("All is non-empty.")
}
上述输出(在Go Playground上尝试):
One is empty!
All is non-empty.
您的示例如下所示:
if containsEmpty(registerRequest.Email,
registerRequest.PhoneNumber,
registerRequest.NachName,
registerRequest.VorName,
registerRequest.Password,
registerRequest.VerificationId) {
// One of the listed strings is empty
}
同样registerRequest
是一个有点长的名字,它可以缩短为r
。如果你不想或不想在周围的代码中重命名,如果你想缩短条件,你也可以这样做:
如果registerRequest
是指针(或界面),您也可以写:
if r := registerRequest; containsEmpty(r.Email,
r.PhoneNumber,
r.NachName,
r.VorName,
r.Password,
r.VerificationId) {
// One of the listed strings is empty
}
实际上,即使registerRequest
不是指针,你也可以这样做,但结构将被复制。如果registerRequest
是struct
,那么您可以使用其地址以避免像这样复制它:
if r := ®isterRequest; containsEmpty(r.Email,
r.PhoneNumber,
r.NachName,
r.VorName,
r.Password,
r.VerificationId) {
// One of the listed strings is empty
}
答案 1 :(得分:5)
正如Mario Santini在评论中所提到的,一种提高可测试性的方法,封装了这个逻辑,并将其与处理程序方法分离(根据字段数判断,它有可能以不同于处理程序的速率进行更改)可以将这个逻辑放在一个函数中:
func validRequest(registerRequest ?) bool {
return registerRequest.Email == "" ||
registerRequest.PhoneNumber == "" ||
registerRequest.NachName == "" ||
registerRequest.VorName == "" ||
registerRequest.Password == "" ||
registerRequest.VerificationId == ""
}
现在支持非常集中的表驱动测试,它可以实现独立于任何涉及编写标题的方法的有效请求。
它允许您验证封闭函数的有效/无效路径,但在此处进行非常集中的测试。它还允许您更改有效请求的含义,并独立于您的封闭功能进行验证。
答案 2 :(得分:0)
您可以使用 switch
:
switch "" {
case registerRequest.Email,
registerRequest.NachName,
registerRequest.Password,
registerRequest.PhoneNumber,
registerRequest.VerificationId,
registerRequest.VorName:
w.WriteHeader(UNABLE_TO_PROCEED)
w.Write([]byte("Unable to register account."))
return
}