推断这些方法的最佳做法是什么?

时间:2015-04-01 18:09:30

标签: casting go

我有一个自定义时间格式,我用它来正确编码/解码json。但是每当我需要进行时间计算时,我都需要进行演员表演。这是正确的方法吗?继续铸造感觉有点难看。例如,当我需要“更新”我需要投射两次的值(一次到一次,一次到我的类型)

type Mytime time.Time
var t Mytime
t = Mytime(time.Now())
// Add an hour to my typed time
t = Mytime(time.Time(t).Add(1 * time.Hour))

1 个答案:

答案 0 :(得分:2)

据推测,你有type Mytime time.Time。相反,如果你嵌入它:

type MyTime struct {
        time.Time
}

然后你可以:

func (t MyTime) MarshalJSON() ([]byte, error) {
        … whatever …
}

仍然可以访问所有time.Time的方法。 例如。类似的东西:

        t := MyType{time.Now()}
        t.Time = t.Add(time.Hour)

富勒示例显示嵌入式和非嵌入式自定义时间类型之间的差异。请注意,嵌入仍然不允许与期望time.Time值的事物透明地互用。 (这里省略了制作这些类型的原因,例如添加MarshalJSON方法。)

package main

import (
    "fmt"
    "time"
)

type YourTime time.Time

type MyTime struct{ time.Time }

// Some random functions, perhaps in a third party package,
// that deals with time.Time values.
func fn(t time.Time) {
    fmt.Println("fn got:", t)
}

func fn2() time.Time {
    return time.Unix(14e8, 0)
}

func main() {
    var t1 = YourTime(time.Now())
    //t1 = t1.Add(time.Hour)             // compiler error
    t1 = YourTime(time.Time(t1).Add(time.Hour))
    fmt.Println("ugly t1:", t1)
    fmt.Println("nice t1:", time.Time(t1))
    //fn(t1)                        // compiler error
    fn(time.Time(t1))

    //t1 = fn2()                    // compiler error
    t1 = YourTime(fn2())

    var t2 = MyTime{time.Now()}
    // t2 = t2.Add(time.Hour)       // compiler error
    t2.Time = t2.Add(time.Hour)
    fmt.Println("t2:", t2)
    //fn(t2)                        // compiler error
    fn(t2.Time)

    //t2 = fn2()                    // compiler error
    t2.Time = fn2()
}

Playground

输出:

ugly t1: {63393494400 0 0x1c9340}
nice t1: 2009-11-11 00:00:00 +0000 UTC
fn got: 2009-11-11 00:00:00 +0000 UTC
t2: 2009-11-10 23:00:00 +0000 UTC
fn got: 2009-11-10 23:00:00 +0000 UTC