下面的代码产生了不受欢迎的
[20010101 20010102]。
当取消注释 String 函数时,它会产生更好的效果(但不是我的实现):
[{20010101 1.5} {20010102 2.5}]
但是,永远不会调用 String func。我看到 DateValue 中的 Date 是匿名的,因此func (Date) String
DateValue 正在使用它。
所以我的问题是:
1) 这是语言问题、fmt.Println
实现问题还是其他问题?注意:如果我从以下位置切换:
func (*DateValue) String() string
至
func (DateValue) String() string
我的函数至少被调用并且随之而来的是恐慌。因此,如果我真的想要调用我的方法,我可以这样做,但假设 DateValue 确实是一个非常大的对象,我只想通过引用传递它。
2) 将匿名字段与 Stringer 和 json 编码等在幕后使用反射的功能混合在一起的好策略是什么?例如,为碰巧用作匿名字段的类型添加 String 或 MarshalJSON 方法可能会导致奇怪的行为(就像您只打印或编码整体的一部分)。
package main
import (
"fmt"
"time"
)
type Date int64
func (d Date) String() string {
t := time.Unix(int64(d),0).UTC()
return fmt.Sprintf("%04d%02d%02d", t.Year(), int(t.Month()), t.Day())
}
type DateValue struct {
Date
Value float64
}
type OrderedValues []DateValue
/*
// ADD THIS BACK and note that this is never called but both pieces of
// DateValue are printed, whereas, without this only the date is printed
func (dv *DateValue) String() string {
panic("Oops")
return fmt.Sprintf("DV(%s,%f)", dv.Date, dv.Value )
}
*/
func main() {
d1, d2 := Date(978307200),Date(978307200+24*60*60)
ov1 := OrderedValues{{ d1, 1.5 }, { d2, 2.5 }}
fmt.Println(ov1)
}