go - 如何连接结构的字符串字段而忽略空字符串?
问题描述
我对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[:], " ")
我认为这种方法非常冗长,并且缺乏围棋技能。改用字符串生成器会更好吗?有没有办法以反射方式遍历结构的所有字段并加入它们?
解决方案
遍历字符串字段并收集非空字符串。加入领域。
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。
推荐阅读
- java - 从 Spring Data 存储库获取支持的类型
- bootstrap-4 - 如何在引导工具提示中显示表格
- node.js - Node.js REPL 中的 'clearBufferedCommand() 方法有什么作用
- java - 无法从 Play 商店下载应用程序的区域设置
- javascript - 可以开玩笑测试thenable吗?
- php - PHP Prepared Statement 未正确执行
- elasticsearch - Kafka Configuration [TOPIC] 使用 ELK 收集系统日志
- c# - 为什么 swagger.json 在 IIS 上的网站下作为应用程序托管时找不到错误?
- android - 为什么我的 getChildView() 被调用了 2 次?
- c - AVR GCC - 使用静态库 - 未定义的参考错误