string - 使用分隔符打印结构体中的字段列表

标签 string go struct

我有一个包含三个字段的类型

type Person struct {
    FirstName string
    LastName  string
    Age       int
}

创建实例并使用默认的 fmt.Sprint() 返回 {John Smith 45}。然而,对于我的用例,我需要一个格式为 John, Smith, 45 的字符串。以逗号分隔的列表,不使用花括号括起来。有没有比以下方法更可重用且有效的方法:

fmt.Sprintf("%s, %s, %d", x.FirstName, x.LastName, x.Age)

我将经常将此方法与其他类型一起使用,并且我更喜欢通用方法,而不必为我使用的每种类型键入格式:

func asFields(data interface{}) string {
    // TODO logic here
}

最佳答案

fmt 的动词不支持该确切格式。包。

最接近的是

s := fmt.Sprintf("%#v", p)

这会生成一个字符串,例如:

main.Person{FirstName:"John", LastName:"Smith", Age:45}

如果您确实需要在问题中发布的内容,您可以使用反射来迭代字段并构建结果,如下所示:

func asFields(data interface{}) string {
    v := reflect.ValueOf(data)
    b := &strings.Builder{}
    for i := 0; i < v.NumField(); i++ {
        if i > 0 {
            b.WriteString(", ")
        }
        b.WriteString(fmt.Sprint(v.Field(i).Interface()))
    }
    return b.String()
}

这确实给出了:

John, Smith, 45

尝试 Go Playground 上的示例.

请注意,这个 asFields() 函数可以处理所有结构类型,当然不仅仅是您的 Person。当然,需要进行调整来处理指针和结构体。

另请注意,可以替代 fmt.Sprint()您也可以使用fmt.Fprint()定向到我们正在其中组装字符串的缓冲区:

func asFields(data interface{}) string {
    v := reflect.ValueOf(data)
    b := &strings.Builder{}
    for i := 0; i < v.NumField(); i++ {
        if i > 0 {
            b.WriteString(", ")
        }
        fmt.Fprint(b, v.Field(i).Interface())
    }
    return b.String()
}

这当然会给出相同的结果(并且可能会或可能不会更快,对其进行基准测试)。试试 Go Playground .

关于string - 使用分隔符打印结构体中的字段列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59247344/

相关文章:

python - Python 中的字符串处理

swift - Swift 5 中一个简单的字符串处理函数

logging - 如何使用golang客户端写入连续写入influxdb

go - 使用反射更新结构中的属性

c - C 中的结构复制,其中结构是元素

PHP:如何在随机位置的字符串中添加随机字符

java - 格式化 URL 变得更容易了吗?

go - 为什么这个 go 代码不使用 goroutine 打印任何东西

http - 异步 http 请求处理

c++ - 动态创建、命名和放置队列