两个结构指针之间的类型转换

时间:2019-05-25 19:21:50

标签: go struct type-conversion

我有一个struct,它由一个自定义time.Time定义,这是为了遵循this answer的建议,它具有一个自定义MarshalJSON()接口:

type MyTime time.Time
func (s myTime) MarshalJSON() ([]byte, error) {
    t := time.Time(s)
    return []byte(t.Format(`"20060102T150405Z"`)), nil
}

我用MyStruct类型的ThisDateThatDate字段定义了*MyTime类型:

type MyStruct struct {
    ThisDate *MyTime `json:"thisdate,omitempty"`
    ThatDate *MyTime `json:"thatdate,omitempty"`
}

据我了解,我需要使用*MyTime而不是MyTime,所以当我omitempty的变量时,MarshalJSON标签会起作用根据{{​​3}}的建议进行输入。

我使用的库的功能可以返回struct,其中某些字段的类型为*time.Time

someVar := Lib.GetVar()

我试图这样定义MyStruct类型的变量:

myVar := &MyStruct{
    ThisDate: someVar.ThisDate
    ThatDate: someVar.ThatDate
}

自然,它给了我一个编译错误:

cannot use someVar.ThisDate (variable of type *time.Time) as *MyTime value in struct literal ...

我尝试使用someVar.ThisDate / *进行&的类型转换,而没有这些则没有运气。我认为以下方法会起作用:

myVar := &MyStruct{
    ThisDate: *MyTime(*someVar.ThisDate)
    ThatDate: *MyTime(*someVar.ThatDate)
}

但这给了我一个不同的编译错误:

invalid operation: cannot indirect MyTime(*someVar.ThisDate) (value of type MyTime) ...

似乎我可能对Go中的指针和取消引用缺乏基本的了解。不管怎样,我想避免为我的问题找到一个具体的解决方案,而这只能归结为使omitempty生效和自定义MarshalJSON的需要。

1 个答案:

答案 0 :(得分:0)

问题是*T(v)或您在此尝试过的任何其他语法都模棱两可。 Golang's spec给出了有关类型转换的有用示例,引述如下:

*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to *Point

因此,由于需要*Point,因此应使用*T(v)