【发布时间】:2016-01-04 22:12:32
【问题描述】:
解释我的问题的最短方法是that code:
var i interface{} // I can't change it. In fact this is a function,
i = Item{10} // that receives interface{}, that contain object (not pointer to object!)
fmt.Printf("%T %v\n", i, i)
// fmt.Println(i.(NextValuer).NextVal()) // won't compile
i = &i
fmt.Printf("%T %v\n", i, i) // there i is pointer to interface{} (not to Item)
// fmt.Println(i.(NextValuer).NextVal()) // panics
// fmt.Println(i.(*NextValuer).NextVal()) // won't compile
但是,如果我尝试将指向 Item 的指针设置为 i,则代码有效:
i = &Item{10}
fmt.Printf("%T %v\n", i, i)
fmt.Println(i.(NextValuer).NextVal())
但我的函数接收对象,而不是指向它的指针。我可以得到它的类型(第一个fmt.Printf)。但是当我尝试指向它时,我收到指向 interface{} 的指针,而不是指向我的对象 (Item) 的指针。
我可以指向这个对象来调用NextVal吗?或者可能是其他方式来做到这一点
【问题讨论】:
-
这一行没有意义:
i = &i -
可能是。但
stdout中的前两行不同 -
这里最好的建议可能是:停止给牦牛剃毛,从头开始重新设计一切。 NextValuer 闻起来像是在 Go 上强制迭代器。如果某件事只是无休止地返回一个又一个,为什么不使用通道呢?
-
@Volker 这只是显示问题的简短版本。真正的代码更大更复杂
-
然后重新设计似乎更合适。