2015-10-19 2 views
0

У меня есть именованный тип, который мне нужно сделать, чтобы сделать некоторые JSON unmarshmaling:Вызов метода именованного типа

type StartTime time.Time 
func (st *StartTime) UnmarshalJSON(b []byte) error {...} 

Поскольку StartTime является time.Time, я думал, что я мог бы назвать методы, которые принадлежат к time.Time, такой как Date():

myStartTime.Date() // myStartTime.Date undefined (type my_package.StartTime has no field or method Date) 

Как я могу добавить методы к существующему типу, сохраняя при этом свои оригинальные методы?

+0

См [этот ответ] (http://stackoverflow.com/questions/29397801/whats- примеры наилучших практик-to-infer-the-methods/29397985 # 29397985) для примеров различий между вложением/не вложением пользовательского типа времени. –

ответ

4

Используя ключевое слово type, вы создаете новый тип и как таковой не будете иметь методы базового типа.

Используйте вложение:

Цитирование из Spec: Struct types:

Поле или methodf анонимного поля в структуры x называется способствует если x.f является законным селектор, который обозначает это поле или метод f.

Таким образом, все методы и поля встроенных (анонимных) полей продвигаются и могут быть отнесены к ним.

Пример его использования:

type StartTime struct { 
    time.Time 
} 

func main() { 
    s := StartTime{time.Now()} 
    fmt.Println(s.Date()) 
} 

Output (попробуйте на Go Playground):

2009 November 10 
+0

Не знал о функциональности 'promotion', спасибо! – Tyler

+1

@Tyler Спасибо за редактирование. Также отредактировал код на игровой площадке и разместил новую ссылку. – icza

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