为什么Go中的时间在结构中的打印方式不同?

时间:2017-09-11 03:05:31

标签: datetime go struct

我刚开始使用Go,在我编写的第一个程序中,我打印出一个结构,也显示了

{wall:0 ext:63533980800 loc:<nil>}

感到困惑的是它似乎是time.Time()类型,谷歌搜索带我到this part of the Go source code,其中#34;挂钟&#34;和#34;单调时钟&#34;在评论中解释。

因此,为了隔离测试,我创建了一个新的简约程序:

package main

import (
    "fmt"
    "time"
)

type TheStruct struct {
    the_time time.Time
}

func main() {
    the_struct := TheStruct{time.Now()}
    fmt.Println(the_struct)
    fmt.Printf("%+v\n", the_struct)
    fmt.Println(the_struct.the_time)
    fmt.Println()
    the_struct_2 := TheStruct{time.Unix(1505099248, 200)}
    fmt.Println(the_struct_2)
    fmt.Printf("%+v\n", the_struct_2)
    fmt.Println(the_struct_2.the_time)
}

打印出以下内容:

{{13719544904843884912 534246 0x1140680}}
{the_time:{wall:13719544904843884912 ext:534246 loc:0x1140680}}
2017-09-11 05:08:11.35635032 +0200 CEST m=+0.000534246

{{200 63640696048 0x1140680}}
{the_time:{wall:200 ext:63640696048 loc:0x1140680}}
2017-09-11 05:07:28 +0200 CEST

所以我想知道这里有两件事:

  1. 为什么将结构的一部分作为挂钟打印的时间与单独打印时使用the_struct.the_time)时更常用的日期时间表示法相比较?
  2. 我的其他程序中的代码是否打印出<nil>为loc的问题?我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:5)

在结构中没有打印格式化时间的原因是未在未导出的字段上调用String方法(参考https://golang.org/pkg/fmt/):

  

打印结构时,fmt不能,因此不会调用   格式化方法,如未导出字段上的错误或字符串。

将结构更改为导出字段(将首字母大写)使其调用String方法:

   package main

import (
    "fmt"
    "time"
)

type TheStruct struct {
    The_time time.Time
}

func main() {
    the_struct := TheStruct{time.Now()}
    fmt.Println(the_struct)
    fmt.Printf("%+v\n", the_struct)
    fmt.Println(the_struct.The_time)
    fmt.Println()
    the_struct_2 := TheStruct{time.Unix(1505099248, 200)}
    fmt.Println(the_struct_2)
    fmt.Printf("%+v\n", the_struct_2)
    fmt.Println(the_struct_2.The_time)
}

输出:

{2009-11-10 23:00:00 +0000 UTC m=+0.000000000}
{The_time:2009-11-10 23:00:00 +0000 UTC m=+0.000000000}
2009-11-10 23:00:00 +0000 UTC m=+0.000000000

{2017-09-11 03:07:28.0000002 +0000 UTC}
{The_time:2017-09-11 03:07:28.0000002 +0000 UTC}
2017-09-11 03:07:28.0000002 +0000 UTC

在操场上:https://play.golang.org/p/r0rQKBlpWc

答案 1 :(得分:2)

另一个答案很好地涵盖了你问题的第一部分,所以我只在这里介绍第二部分。

简单地说,不,没有,nil位置不是问题,因为根据time.Time的源代码,零位置意味着UTC。

// loc specifies the Location that should be used to
// determine the minute, hour, month, day, and year
// that correspond to this Time.
// The nil location means UTC.
// All UTC times are represented with loc==nil, never loc==&utcLoc.
loc *Location