2010-09-27 24 views
-1

处理go的funcs我发现,当使用'generic'interface {}类型时,我不会强制编译器控制是否传递一个值或指向值的参数。如何强制编译器控制值/指针值函数参数?

func f(o interface{}) { 
... 
} 

最明显的解决方案是使用以下修改:

func f(o *interface{}) { 
... 
} 

虽然这是编译成功我认为这没有算一步吧。那么,有没有办法说明我想通过指针

+0

只是想知道,为什么你会需要这样做? – cthom06 2010-09-28 11:45:23

+0

我刚刚习惯了严格的参数化我的代码,以确定更深刻的设计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

回答

1

否。在编译时,interface{},空的接口是任何类型。

所有类型实现空 接口:interface{}Interface types

+0

是的,在Go的当前设计下,看起来就是这样。小气。 – PGene 2010-10-01 17:35:27

2

你不得不使用reflection

import "reflect" 

func f(o interface{}) { 
    if _, ok := reflect.Typeof(o).(*reflect.PtrType); !ok { 
    panic("Not a pointer") 
    } 
    // ... 
} 

你也可以考虑unsafe.Pointer,但是类型信息会丢失。

+0

是的,这正是我为解决问题所做的。然而,反思的方式似乎是费力和有点拐杖。此外,它在编译时无用。 – PGene 2010-09-28 14:20:16

相关问题