Text 如何在Golang中创建固定长度的文本文件?

Text 如何在Golang中创建固定长度的文本文件?,text,go,Text,Go,我需要从数据库中的数据创建一个固定长度的文本文件。数据导出没有问题,将数据加载到Go中也可以。如何以固定长度样式打印数据 我有以下结构 type D struct { A10 string // Should be 10 characters in result file A20 string // Should be 20 characters in result file A50 string // Should be 50 characters in result file }

我需要从数据库中的数据创建一个固定长度的文本文件。数据导出没有问题,将数据加载到Go中也可以。如何以固定长度样式打印数据

我有以下结构

type D struct {
  A10 string // Should be 10 characters in result file
  A20 string // Should be 20 characters in result file
  A50 string // Should be 50 characters in result file
}

var d := D{ "ten", "twenty", "fifty" }
因此,打印结构的结果应该是

|       ten|              twenty|                                   fifty|
我已经计算出,
fmt.Printf(“%10s”,“ten”)
将预结束到10个前导空格,但我不知道如何阻止它溢出:
fmt.Printf(“%10s”,“tenaaaaaa”)
将打印11个字符

我想到了一个函数,它遍历每个字段并删除太长的字符串:

func trimTooLong(d *D) {
  d.A10 = d.A10[:10]
  d.A20 = d.A20[:20]
  d.A50 = d.A20[:50]
}

有更好的方法吗?

我认为你的方法很好。您还可以使用或接口来比使用函数更干净地执行此操作。

我认为您的方法很好。您还可以使用或接口来比使用函数更干净地执行此操作。

您的方法确实不错,但在我看来,您应该重新考虑使用该代码的目标

在不使用TextMarshaler或String的情况下实现它的一种干净方法是使用以下内容:

func writeTrimmed(w io.Writer, in []*D) error {
    for _, d := range in {
        a10, a20, a50 := d.A10, d.A20, d.A50
        if len(a10) > 10 {
            a10 = a10[:10]
        }
        if len(a20) > 20 {
            a20 = a20[:20]
        }
        if len(a50) > 50 {
            a50 = a50[:50]
        }
        if _, err := fmt.Fprintf(w, "|%10s|%20s|%50s|\n", a10, a20, a50); err != nil {
            return err
        }
    }
    return nil
}

您的方法确实很好,但在我看来,您应该重新考虑使用该代码的目标

在不使用TextMarshaler或String的情况下实现它的一种干净方法是使用以下内容:

func writeTrimmed(w io.Writer, in []*D) error {
    for _, d := range in {
        a10, a20, a50 := d.A10, d.A20, d.A50
        if len(a10) > 10 {
            a10 = a10[:10]
        }
        if len(a20) > 20 {
            a20 = a20[:20]
        }
        if len(a50) > 50 {
            a50 = a50[:50]
        }
        if _, err := fmt.Fprintf(w, "|%10s|%20s|%50s|\n", a10, a20, a50); err != nil {
            return err
        }
    }
    return nil
}

您可以使用字符串格式中的精度来截断输出作为字段宽度

fmt.Printf("%5.5s", "Hello, world")
fmt.Printf("%5.5s", "A")
将输出“Hello A”

因此,在您的示例中,这将实现以下技巧:

fmt.Printf("%10.10s%20.20s%50.50s", d.A10, d.A20, d.A50)

可以使用字符串格式中的精度将输出截断为字段宽度

fmt.Printf("%5.5s", "Hello, world")
fmt.Printf("%5.5s", "A")
将输出“Hello A”

因此,在您的示例中,这将实现以下技巧:

fmt.Printf("%10.10s%20.20s%50.50s", d.A10, d.A20, d.A50)

这是到目前为止最合适的方法,因为我也可以像
fmt.Printf(“%05.5”,“12”)
一样填充“0”,这是到目前为止最合适的方法,因为我也可以像
fmt.Printf(“%05.5”,“12”)
一样填充“0”,这不好,因为它在指定的较短字符串上恐慌。这不好,因为它在指定的较短字符串上恐慌。旁注,您希望在声明
d
变量时排除
var
。应该看起来像
d:=d{“十”、“二十”、“五十”}
侧注,您希望在声明
d
变量时排除
var
。应该看起来像
d:=d{“十”、“二十”、“五十”}