Go:如何以可读的方式格式化此结构?

时间:2014-12-10 08:14:08

标签: go string-formatting

我有一个包裹time.Time对象的结构,并希望以人类可读的方式对其进行格式化。

package main

import (
    "time"
    "fmt"
)

type TimeStruct struct {
    t time.Time
}

func main() {
    t := time.Now()
    fmt.Printf("time: %v\n", t)          // nice

    ts := TimeStruct{t: t}
    fmt.Printf("time struct: %#v\n", ts) // ugly
}

Play

为什么不格式化t中的TimeStruct字段与普通time.Time对象相同?是否有一种简单的方法以可读的方式格式化它(没有为它定义额外的方法)?

2 个答案:

答案 0 :(得分:3)

使用%v时,获得所需人工可读时间的唯一方法是实现Stringer界面。

package main

import (
    "time"
    "fmt"
)

type TimeStruct struct {
    t time.Time
}
func (self TimeStruct) String() string {
    return fmt.Sprintf("TimeStruct{time.Time: %v}", self.t)
}

func main() {
    t := time.Now()
    ts := TimeStruct{t: t}
    // time struct: TimeStruct{time.Time: 2009-11-10 23:00:00 +0000 UTC}
    fmt.Printf("time struct: %v\n", ts)
}

答案 1 :(得分:1)

另一个替代方案是嵌入时间,因此可以在TimeStructplayground)上使用其方法,例如

type TimeStruct struct {
    time.Time
}

func main() {
    t := time.Now()
    fmt.Printf("time: %v\n", t)

    ts := TimeStruct{Time: t}
    fmt.Printf("time struct: %v\n", ts)
}

打印

time: 2009-11-10 23:00:00 +0000 UTC
time struct: 2009-11-10 23:00:00 +0000 UTC

请注意使用%v而非%#v将打印结构成员。