【问题标题】:Print Missing Values打印缺失值
【发布时间】:2021-04-13 19:49:25
【问题描述】:

使用 Go,我试图将值从 main 发送到函数。我想检查发送给函数的任何参数是否为空。如果有任何缺失值,我想打印“参数值”为空。如果有多个参数为空,我也想打印它。如果所有参数都正确给出,则返回值。

func FederationValidarator(a string, b string) (string, string) {
    // var Messages []string
    rArray := [2]string{a, b}
    // i :=0
    for i := 0; i < len(rArray); i++ {
        if rArray[i] != "" {
            fmt.Println("Nothing is empty")
        } else {
            // var Messages []string
            fmt.Println("%s is Missing")
        }
    }
    return a, b
}

func main() {
    a, b := FederationValidarator("", "world")
    fmt.Println(a)
    fmt.Println(b)
}

如何编写代码以打印缺失值?我想得到以下输出。

结果:

%s is Missing
Nothing is empty

world

预期输出:

a is Missing
world

【问题讨论】:

  • 您的问题缺少一个问题。
  • @zerkms...谢谢您的建议....我已经更新了这个问题。请查找参考
  • if a == "" { fmt.Println("A is missing" } ?
  • @zerkms ...是的,这就是我想要创建的。
  • @zerkms.. 感谢您的回复。我已经更新了问题和代码以及出现的结果和预期的输出。你能调查一下吗。谢谢。

标签: arrays loops go conditional-statements


【解决方案1】:

无法获取参数名称(如a),详见Getting method parameter names

如果需要参数名,把参数包装成一个struct,就可以得到字段名。您可以使用反射来遍历字段,并获取它们的值和名称。

例如:

type Param struct {
    A string
    B string
    C string
}

func CheckValues(p Param) {
    v := reflect.ValueOf(p)

    t := v.Type()
    for i := 0; i < v.NumField(); i++ {
        name := t.Field(i).Name
        if v.Field(i).IsZero() {
            fmt.Printf("%s is empty\n", name)
        } else {
            fmt.Printf("%s is NOT empty\n", name)
        }
    }
}

测试它:

p := Param{"", "world", ""}
CheckValues(p)

输出(在Go Playground上试试):

A is empty
B is NOT empty
C is empty

这个解决方案的一个非常好的特性是它不依赖于实际的参数类型。您可以将任何结构值传递给它,它会继续工作。它还处理“所有”字段类型,而不仅仅是字符串。

所以把签名修改成这样:

func CheckValues(p interface{})

您还可以传递匿名结构,而不仅仅是定义类型的值:

a, b, c, d := "", "world", 0, 3

CheckValues(struct {
    A string
    B string
    C int
    D int
}{a, b, c, d})

这将输出(在Go Playground 上尝试):

A is empty
B is NOT empty
C is empty
D is NOT empty

【讨论】:

    【解决方案2】:

    此代码是为了匹配您期望的结果。但这不是检查参数名称的正确方法。

    func FederationValidarator(a string, b string) (string, string) {
        
        rArray := [2]string{a, b}
        
        for i := 0; i < len(rArray); i++ {
            if string(rArray[i]) == "" {
                fmt.Printf("%s is Missing\n", rArray[i]) // %s is empty string, Then nothing will appear.
            } else {                        
               fmt.Println(rArray[i])
            }
        }    
        return a, b
    }
     
    func main() {
        _, _ = FederationValidarator("", "world")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2020-03-19
      • 2016-09-18
      • 2019-03-21
      • 1970-01-01
      相关资源
      最近更新 更多