考虑下面的结构Foo和处理多种类型的目标(其中Handle可能Read,Write等等)。我知道当我们使用空接口时,我们会丢失编译时类型检查,但除此之外,每个接口的优缺点是什么?最后,实现这一目标的最惯用的方法是什么?package maintype Foo struct { A int B string}//Handle all types with switchfunc (f *Foo) Handle(obj interface{}) { switch obj := obj.(type) { case int: //do int stuff... f.A + obj case string: //do string stuff... f.B + obj default: panic("Unknown type") }}//Handle each type individuallyfunc (f *Foo) HandleInt(i int) { //do int stuff... f.A + i}func (f *Foo) HandleString(s string) { //do string stuff... f.B + s}
2 回答
繁星淼淼
TA贡献1775条经验 获得超11个赞
如果您要通过reflect
. 那是fmt.Printf
,json.Encode
和binary.Write
的理由接受它。就您之前发布的Merkle 树场景而言,您正在对事物进行哈希处理,如果您Hash()
有reflect
基于 -based 的回退来对用户创建的结构进行哈希处理,那么您将使用空接口。
如果您只打算为几个关键类型([]byte
, string
, 等等)提供方法,则特定方法可能更有意义。除了编译时检查之外,函数列表还可以作为可以散列的内容的文档。另一方面,如果有,比如,你想要散列的十几种类型——想想所有的 (u)int 类型和它们的切片——我想我会interface{}
为了一个整洁而使用API 除非您绝对需要最好的性能,但我认为没有一种明确的共识。
- 2 回答
- 0 关注
- 209 浏览
添加回答
举报
0/150
提交
取消