- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有人可以帮我看看这里出了什么问题吗?由于某种原因,输出不一样,我不明白为什么。
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
的实现。
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/
我正在尝试编写一个简单的自定义编码(marshal)拆收器,但失败了。请注意,我有一个具有三个功能的界面。 Happy 和 Sad 结构都通过嵌入实现所有三个必需功能的 emotion 结构来实现此接
这有效:http://play.golang.org/p/-Kv3xAguDR . 这会导致堆栈溢出:http://play.golang.org/p/1-AsHFj51O . 我不明白为什么。在这种
我在其他语言(如 Java)中创建自己的类型作为枚举值。我为此类型实现了反序列化 UnmarshalJSON 方法,发现 marshal 无法转换为自定义类型 package main import
有人可以帮我看看这里出了什么问题吗?由于某种原因,输出不一样,我不明白为什么。 type rTime time.Time func (rt *rTime) UnmarshalJSON(data []b
所以,我有结构 P。我需要将一些 json 数据解码到 P,但有时它会出现嵌入式结构,Embedded。在任何一种情况下,我都从 API 中解码 json 并需要格式化“Formatted”字段。在嵌
在decode.go ,它提到: // To unmarshal JSON into a value implementing the Unmarshaler interface, // Unmars
我有一个简单的类型,它在 Go 中实现了子类型整数常量到字符串的转换,反之亦然。我希望能够自动将 JSON 中的字符串解码为这种类型的值。我不能,因为 UnmarshalJSON 没有给我返回或修改标
我想 UnmarshalJSON 包含如下接口(interface)的结构: type Filterer interface { Filter(s string) error } type F
当您将 JSON 解码为 []interface{} 时,除了 bool、int 和 string 等标准类型之外,还有什么方法可以自动检测类型吗? 我注意到以下内容,假设我编码 [uuid.UUID
我有一个 struct,它嵌入了一个指向另一个 struct 的嵌入式指针。当我使用默认的 json.Unmarshal 行为时,它工作得很好。但是当我为 embedded struct 的类型实现
我想要使用 base64 在 JSON 中编码和解码的 byte slice RawURLEncoding 而不是 StdEncoding。没有明显的方法可以通过 encoding/json pack
我得到了以下自定义类型: type TimeWithoutZone struct { time.Time } 编码(marshal)处理工作正常: const timeWithoutZoneF
如何在结构中创建方法 UnmarshalJSON,在内部使用 json.Unmarshal 而不会导致堆栈溢出? package xapo type Xapo struct {} func (x Xa
我正在尝试解码具有嵌入式类型的结构。当嵌入类型具有 UnmarshalJSON 方法时,外部类型的解码失败: https://play.golang.org/p/Y_Tt5O8A1Q package
我想执行一些额外的步骤来初始化我的实现 UnmarshalJSON 中的数据结构。在该实现中调用 json.Unmarshal(b, type) 自然会导致堆栈溢出。 JSON 解码器不断尝试查找,如
我的应用程序中有以下结构 // foo.go type FooList struct { Fools []*foo `json:"list"` // maybe Req *h
Go 提供了 encoding/json.Unmarshaler 接口(interface),因此类型可以控制它们从 JSON 解码的方式。在几乎所有情况下,编码后的 JSON 值都直接传递给 Unm
我是一名优秀的程序员,十分优秀!