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

dfi*_*dfi 4 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

    }
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 8

注意:如果您在处理程序中保留"is-valid"条件,并且将条件分成另一个函数或方法,则可以使用下面的解决方案.

您可以创建一个简单的辅助函数,它具有可变参数,您可以使用任意数量的string值调用它:

func containsEmpty(ss ...string) bool {
    for _, s := range ss {
        if s == "" {
            return true
        }
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

使用它的示例:

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.")
}
Run Code Online (Sandbox Code Playgroud)

以上输出(在Go Playground上试试):

One is empty!
All is non-empty.
Run Code Online (Sandbox Code Playgroud)

您的示例如下所示:

if containsEmpty(registerRequest.Email,
    registerRequest.PhoneNumber,
    registerRequest.NachName,
    registerRequest.VorName,
    registerRequest.Password,
    registerRequest.VerificationId) {

    // One of the listed strings is empty
}
Run Code Online (Sandbox Code Playgroud)

也是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
}
Run Code Online (Sandbox Code Playgroud)

实际上即使registerRequest不是指针也可以这样做,但结构将被复制.如果registerRequest是a struct,那么你可以取其地址以避免像这样复制它:

if r := &registerRequest; containsEmpty(r.Email,
    r.PhoneNumber,
    r.NachName,
    r.VorName,
    r.Password,
    r.VerificationId) {

    // One of the listed strings is empty
}
Run Code Online (Sandbox Code Playgroud)


dm0*_*514 5

正如Mario Santini在评论中提到的那样,一种提高可测试性的方法,封装了这个逻辑,并将其与处理程序方法(根据字段数量判断它看起来有可能以不同于处理程序的速率进行更改)进行分离,可能是把这个逻辑放在一个函数中:

func validRequest(registerRequest ?) bool {
   return registerRequest.Email == "" ||
        registerRequest.PhoneNumber == "" ||
        registerRequest.NachName == "" ||
        registerRequest.VorName == "" ||
        registerRequest.Password == "" ||
        registerRequest.VerificationId == ""
}
Run Code Online (Sandbox Code Playgroud)

这现在支持非常集中的表驱动测试,它可以实现独立于任何涉及编写头的方法的有效请求.

它允许您验证封闭函数的有效/无效路径,但在此处进行非常集中的测试.它还允许您更改有效请求的含义,并独立于封闭功能进行验证.