去重新定义的类型格式和方法

时间:2014-09-23 23:49:45

标签: go

这是一个基本的go程序

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打印时间比time.Time要差。它们基本上应该来自同一类型...另外,如果我尝试访问任何时间方法。时间,让我们说,天,它可用于"正常&#34 ;但不适合"我的#34;。

谢谢!

2 个答案:

答案 0 :(得分:2)

您的新类型不会继承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)
}

答案 1 :(得分:0)

将类型格式化为字符串(如果可用)时,

fmt.Println使用String()方法(或者更确切地说是fmt.Stringer interface)。使用基础类型创建新类型时(在您的情况下为time.Time):

type myTime time.Time

您不会继承基础类型的方法集。因此,myTime没有String()方法,因此fmt将使用结构的默认格式。