我正在开始 Go 之旅,但我正在尝试。
我写了一段代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
actualTime := time.Now()
fmt.Println(actualTime)
var marshalledtime []byte
marshalledtime,_ := actualTime.MarshalJSON()
fmt.Println(marshalledtime)
actualTime := (*time.Time).UnmarshalJSON(marshalledtime)
fmt.Println(actualTime)
}
我只是想编码一个简单的日期,然后解编它以查看过程。
但我完全被问题压垮了。到今天为止,GO 似乎是如此简单和合乎逻辑,但现在......我不知道,我被困住了。
./compile219.go:27:13: cannot use time.(*Time).UnmarshalJSON(marshalledtime) (type error) as type time.Time in assignment
./compile219.go:27:42: not enough arguments in call to method expression time.(*Time).UnmarshalJSON
have ([]byte)
want (*time.Time, []byte)
最后一个错误是什么意思?文档清楚地表明 UnmarshalJson
只接受一个参数,byte[]
。
类型转换错误是怎么回事?
最佳答案
actualTime.MarshalJSON()
是一个方法调用,它调用了 Time.MarshalJSON()
方法。它返回时间的 JSON 表示形式的字节。由于打印的字节可读性不好,您应该将字节 slice 打印为字符串,例如:
fmt.Println("Raw:", marshalledtime)
fmt.Println("String:", string(marshalledtime))
哪些输出:
Raw: [34 50 48 48 57 45 49 49 45 49 48 84 50 51 58 48 48 58 48 48 90 34]
String: "2009-11-10T23:00:00Z"
UnmarshalJSON()
也是time.Time
的一个方法,所以你需要一个time.Time
的值来调用它“on”,例如:
var time2 time.Time
time2.UnmarshalJSON(marshalledtime)
(准确地说,UnmarshalJSON()
需要一个*time.Time
类型的指针,因为它必须修改time.Time
值,但 Go 编译器将重写 time2.UnmarshalJSON()
以获取 time2
的地址:(&time2).UnmarshalJSON()
)。
MarshalJSON()
和 UnmarshalJSON()
也会返回一个您应该经常检查的错误,例如:
var marshalledtime []byte
var err error
marshalledtime, err = actualTime.MarshalJSON()
if err != nil {
panic(err)
}
和:
var time2 time.Time
err = time2.UnmarshalJSON(marshalledtime)
if err != nil {
panic(err)
}
试试Go Playground上的固定代码.
另请注意,很少有人“手动”调用 Time.MarshalJSON()
和 Time.UnmarshalJSON()
。他们将实现 json.Marshaler
和 json.Unmarshaler
接口(interface),因此当您编码/解码时间值时,encoding/json
包将调用这些方法来进行 JSON 转换。
这就是使用 encoding/json
包(在 Go Playground 上尝试)可以实现同样的效果:
编码:
var marshalledtime []byte
var err error
marshalledtime, err = json.Marshal(actualTime)
if err != nil {
panic(err)
}
解码:
var time2 time.Time
err = json.Unmarshal(marshalledtime, &time2)
if err != nil {
panic(err)
}
尽管在这种情况下它并不更简单或更短,但 encoding/json
包能够编码/解码任意复杂的数据结构,而不仅仅是简单的时间值。
关于go - 无法解码简单日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57625251/