我有一个包裹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
对象相同?是否有一种简单的方法以可读的方式格式化它(没有为它定义额外的方法)?
答案 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)
另一个替代方案是嵌入时间,因此可以在TimeStruct
(playground)上使用其方法,例如
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
将打印结构成员。