gpt4 book ai didi

unmarshaljson 中的 golang 类型转换

转载 作者:IT王子 更新时间:2023-10-29 02:34:25 28 4
gpt4 key购买 nike

有人可以帮我看看这里出了什么问题吗?由于某种原因,输出不一样,我不明白为什么。

type rTime time.Time

func (rt *rTime) UnmarshalJSON(data []byte) error {
var s string
if err := json.Unmarshal(data, &s); err != nil {
return err
}

t, err := time.Parse("2006-01-02", s)
if err != nil {
return err
}
log.Println(t)

*rt = rTime(t)

log.Println(*rt)
return nil
}

日志看起来像这样:

2014/09/18 04:31:35 1999-10-15 00:00:00 +0000 UTC
2014/09/18 04:31:35 {63075542400 0 0x933ea0}

为什么转换不起作用?输入字符串是 1995-10-15 顺便说一句。

最佳答案

转换正常,但 fmt.Println() 寻找 String() 方法,并且存在于 time.Time但不是你的类型。您只需要 func (rt rTime) String() string { return time.Time(rt).String() } 即可将 String() 调用返回到time.Time 的实现。

Here's an example :

package main

import (
"log"
"time"
)

type rTime time.Time

func (rt rTime) String() string { return time.Time(rt).String() }

func main() {
s := "1999-10-15"
t, err := time.Parse("2006-01-02", s)
if err != nil {
panic(err)
}
log.Println(t)

rt := rTime(t)

log.Println(rt)
}

请注意,我将两种时间类型都视为值,因为 the standard library does , 根据 the canonical advice to avoid pointers for tiny structs with value semantics .

也许更有趣,你可以使用type embedding自动获取 time.Time 的所有方法,但您覆盖的方法除外。语法略有变化 ( see on Playground ):

package main

import (
"log"
"time"
)

type rTime struct { time.Time }

func main() {
s := "1999-10-15"
t, err := time.Parse("2006-01-02", s)
if err != nil {
panic(err)
}
log.Println(t)

rt := rTime{t}

log.Println(rt)
}

如果您使用过嵌入并希望编写自己的自定义方法来“代理通过”嵌入类型的方法,您可以使用像 obj.EmbeddedTypeName.Method 这样的语法,它可能是这样的,例如,rt.Time.String():

// a custom String method that adds smiley faces
func (rt rTime) String() string { return "😁 " + rt.Time.String() + " 😁" }

obj.EmbeddedTypeName 也是您(例如)访问您嵌入的非struct 类型上的运算符的方式。

关于unmarshaljson 中的 golang 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25903326/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com