首页 > 解决方案 > 如何连接结构的字符串字段而忽略空字符串?

问题描述

我对Go真的很陌生,所以想要一些建议。我有一个结构:

type Employee struct {
    Name        string
    Designation string
    Department  string
    Salary      int
    Email       string
}

我想将字符串字段连接成一种员工描述。所以,我可以说: toString(employee) 并得到:

John Smith Manager Sales john.smith@example.com

我试图获取每个字段,检查它们是否为空并将它们放在一个切片中并在最后加入它们

employeeDescArr := make([]string, 0, 4)
if strings.TrimSpace(value) != "" {
    append(employee.GetName(), value)
}...
return strings.Join(employeeDescArr[:], " ")

我认为这种方法非常冗长,并且缺乏围棋技能。改用字符串生成器会更好吗?有没有办法以反射方式遍历结构的所有字段并加入它们?

标签: gostring-concatenation

解决方案


遍历字符串字段并收集非空字符串。加入领域。

func (e *Employee) String() string {
    var parts []string
    for _, s := range []string{e.Name, e.Designation, e.Department, e.Email} {
        if strings.TrimSpace(s) != "" {
            parts = append(parts, s)
        }
    }
    return strings.Join(parts, " ")
}

因为 strings.Join 函数是使用 strings.Builder 实现的,所以将 strings.Join 替换为使用 strings.Builder 的应用程序代码没有任何好处。

以下是如何使用反射来避免列出字符串函数中的字段:

var stringType = reflect.TypeOf("")

func (e *Employee) String() string {
    v := reflect.ValueOf(e).Elem()
    var parts []string
    for i := 0; i < v.NumField(); i++ {
        f := v.Field(i)
        if f.Type() == stringType {
            s := f.String()
            if strings.TrimSpace(s) != "" {
                parts = append(parts, s)
            }
        }
    }
    return strings.Join(parts, " ")
}

如果要包含所有字段(包括非字符串和空字符串),则可以fmt.Sprint(e)获取字符串。请参阅https://play.golang.org/p/yntZxQ-Xs6C


推荐阅读