2014-09-23 4 views
-1

Вот базовую программу GoGo Redefined типа верстку и методы

package main 

import (
     "fmt" 
     "time" 
) 

type myTime time.Time 

func main() { 
     my := myTime(time.Now()) 
     fmt.Println(my) 

     normal := time.Now() 
     fmt.Println(normal) 
} 

и соответствующий выход

{63547112172 291468455 0x545980} 
2014-09-23 23:36:12.292132305 +0000 UTC 

Я хотел бы знать, почему Mytime печатает diffrently чем time.Time. В основном они должны быть одного типа ... Кроме того, если я попытаюсь получить доступ к любому методу времени. Время, допустим, День, оно доступно для «нормального», но не для «моего».

Спасибо!

ответ

1

Ваш новый тип не наследует методы от time.Time. To quote the spec:

Заявленный тип не наследует любые методы, связанные с существующим типом

Поскольку нет String метод, он не будет печатать значимую величину. Вам нужно реализовать это самостоятельно.

Другой вариант - вставить time.Time в свой собственный. Таким образом, вы можете включить функциональность time.Time, но также добавить свои собственные функции.

площадка ссылка: http://play.golang.org/p/PY6LIBoP6H

type myTime struct { 
    time.Time 
} 

func (t myTime) String() string { 
    return "<Custom format here>" 
} 

func main() { 
    my := myTime{time.Now()} 
    fmt.Println(my) 

    normal := time.Now() 
    fmt.Println(normal) 
} 
0

fmt.Println использует метод String() (или, скорее, fmt.Stringer interface) при форматировании типа в виде строки, если он доступен. При создании нового типа, используя базовый тип (в вашем случае time.Time):

type myTime time.Time 

Вы не наследуют methodset базового типа. Поэтому myTime не имеет метода String(), поэтому fmt будет использовать формат по умолчанию для структуры.