go - 无法解码简单日期

标签 go arguments parameter-passing marshalling

我正在开始 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.Marshalerjson.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/

相关文章:

c++ - 将对象作为参数传递时是否调用构造函数?

java - 传递对象Java

google-app-engine - 如何在结构中存储结构?

go - 使用 aws-sdk-go 将对象上传到 AWS S3 而无需创建文件

c++ - 如何传递数组并返回二维矩阵的数组值?

线程可以有多个参数吗?

c - 在 C99 中将运算符作为参数传递

linux - 向其他进程发送信号

调用 Go RPC TCP 服务时 Ruby Socket 客户端挂起

javascript - 将多个参数传递给柯里化(Currying)函数