处理go的funcs我发现,当使用'generic'interface {}类型时,我不会强制编译器控制是否传递一个值或指向值的参数。如何强制编译器控制值/指针值函数参数?
func f(o interface{}) {
...
}
最明显的解决方案是使用以下修改:
func f(o *interface{}) {
...
}
虽然这是编译成功我认为这没有算一步吧。那么,有没有办法说明我想通过指针?
处理go的funcs我发现,当使用'generic'interface {}类型时,我不会强制编译器控制是否传递一个值或指向值的参数。如何强制编译器控制值/指针值函数参数?
func f(o interface{}) {
...
}
最明显的解决方案是使用以下修改:
func f(o *interface{}) {
...
}
虽然这是编译成功我认为这没有算一步吧。那么,有没有办法说明我想通过指针?
否。在编译时,interface{}
,空的接口是任何类型。
所有类型实现空 接口:
interface{}
Interface types
是的,在Go的当前设计下,看起来就是这样。小气。 – PGene 2010-10-01 17:35:27
你不得不使用reflection。
import "reflect"
func f(o interface{}) {
if _, ok := reflect.Typeof(o).(*reflect.PtrType); !ok {
panic("Not a pointer")
}
// ...
}
你也可以考虑unsafe.Pointer
,但是类型信息会丢失。
是的,这正是我为解决问题所做的。然而,反思的方式似乎是费力和有点拐杖。此外,它在编译时无用。 – PGene 2010-09-28 14:20:16
只是想知道,为什么你会需要这样做? – cthom06 2010-09-28 11:45:23
我刚刚习惯了严格的参数化我的代码,以确定更深刻的设计func签名。我不喜欢这段代码在运行时崩溃:func f(o interface {}){//使用指针} type s struct {value int} func main(){sv:= s {value :0}; f(sv)} – PGene 2010-09-28 14:32:24