2014-09-23 23 views
-1

这是一个基本的围棋程序去重新定义类型格式化和方法

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将使用结构的默认格式。