我对golang很陌生。以下代码修改自: https://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go
为什么 Println 调用中的最后一行中必填项?time.Time()
为什么打印 不产生相同的字符串结果?它改为生成一个指针。val["created_at"]
您将看到我尝试了几次创建与自定义时间戳类型一起使用的 Println 函数。是否可以在 Timestamp 自定义类型上定义一个函数,以便代码末尾的 Println 函数输出字符串而不是指针?
我想这可能也回答了我的问题:https://stackoverflow.com/a/6485229/4005067
但是有没有办法定义时间戳类型的某些函数,以便不需要强制转换?
package main
import (
"encoding/json"
"fmt"
"reflect"
"time"
)
// start with a string representation of our JSON data
var input = `
{
"created_at": "Thu May 31 00:00:01 +0000 2012"
}
`
type Timestamp time.Time
func (t *Timestamp) UnmarshalJSON(b []byte) error {
v, err := time.Parse(time.RubyDate, string(b[1:len(b)-1]))
if err != nil {
return err
}
*t = Timestamp(v)
return nil
}
//func (t *Timestamp) Println(a ...interface{}) (n int, err error) {
// return fmt.Println(time.Time(*t))
//}
//func (t Timestamp) String() string {
// return string(t)
//}
func main() {
// our target will be of type map[string]interface{}, which is a pretty generic type
// that will give us a hashtable whose keys are strings, and whose values are of
// type interface{}
var val map[string]Timestamp
if err := json.Unmarshal([]byte(input), &val); err != nil {
panic(err)
}
fmt.Println(val)
for k, v := range val {
fmt.Println(k, reflect.TypeOf(v))
}
fmt.Println(val["created_at"])
fmt.Println(reflect.TypeOf(val["created_at"]))
fmt.Println(Timestamp(val["created_at"]))
fmt.Println(time.Time(val["created_at"]))
}
在操场上的输出是:
map[created_at:{0 63474019201 0x5b0580}]
created_at main.Timestamp
{0 63474019201 0x5b0580}
main.Timestamp
{0 63474019201 0x5b0580}
2012-05-31 00:00:01 +0000 UTC
梵蒂冈之花
相关分类