2014-12-10 8 views
0

У меня есть структура, обертывающая объект 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

Не без указания дополнительных методов. –

+0

Могут ли downvoters добавить конструктивные комментарии? –

ответ

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

Хмм, попробовал в Playground, но '% v', похоже, не заботится о методе' String() '. –

+0

@ zero-divisor отлично работает для меня –

+0

@ zero-divisor это работает [здесь] (http://play.golang.org/p/RPAY-Tyvn5) – nos

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, который напечатает элементы структуры.

+0

Прохладный, не знал этой техники! К сожалению, в моем фактическом использовании у меня есть два поля time.Time в моей структуре, которые не будут работать таким образом, не так ли? –

+0

@ нулевой делитель, в который вы могли бы встроить тот, который будет означать, что только один будет отображаться. Это может сработать для вас, если бы не метод 'String()', как предложил @Jakob Bowyer, это путь. –

Смежные вопросы