2017-09-11 1 views
2

Je viens juste de commencer avec Go, et dans le premier programme que j'ai écrit que j'imprimé un struct, qui a montré égalementPourquoi l'heure dans Go est-elle imprimée différemment dans une structure?

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

Être perplexe sur ce qui était, il semblait être un type time.Time(), et google search m'a amené à this part of the Go source code dans lequel la différence entre "l'horloge murale" et "l'horloge monotone" est expliquée dans les commentaires.

Donc, pour le tester dans l'isolement, je créé un nouveau programme minimaliste:

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) 
} 

qui imprime les éléments suivants:

{{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 

Je me demande donc de deux choses:

  1. Pourquoi l'heure est-elle si une partie d'une structure est imprimée en tant qu'horloge murale par rapport à la notation de date-heure plus habituelle lors de l'impression separatel y (en utilisant the_struct.the_time)?
  2. Est-ce un problème que le code de mon autre programme affiche <nil> pour loc? Comment pourrais-je résoudre cela?

Répondre

4

La raison pour laquelle il n'est pas l'impression du temps formaté quand dans votre struct est cette méthode chaîne n'est pas invoquée dans les champs non exportées (voir https://golang.org/pkg/fmt/):

Lors de l'impression d'une struct, fmt ne peut pas et par conséquent n'invoque pas les méthodes de formatage telles que Error ou String sur les champs non exportés.

Changer votre structure pour exporter des champs (en majuscule la première lettre) fait appeler la méthode 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) 
} 

Sortie:

{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 

Sur terrain de jeu: https://play.golang.org/p/r0rQKBlpWc

1

Le l'autre réponse couvre assez bien la première partie de votre question, donc je ne couvrirai que la deuxième partie ici. Pour simplifier, non, un emplacement nul n'est pas un problème, selon le code source time.Time, un emplacement nul signifie 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