检查多个字符串是否为空的优雅方法

时间:2018-01-12 12:58:54

标签: string go is-empty

如何以优雅的方式检查多个字符串是否为空?这就是我目前的做法:

//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

    }

3 个答案:

答案 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不是指针,你也可以这样做,但结构将被复制。如果registerRequeststruct,那么您可以使用其地址以避免像这样复制它:

if r := &registerRequest; 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
}

https://golang.org/ref/spec#Switch_statements