我有几个这样声明的C函数
CURLcode curl_wrapper_easy_setopt_long(CURL* curl, CURLoption option, long param);
CURLcode curl_wrapper_easy_setopt_str(CURL* curl, CURLoption option, char* param);
我想把它们作为一个Go函数公开,就像这样
func (e *Easy)SetOption(option Option, param interface{})
所以我需要能够在运行时检查 param 类型。我如何做到这一点,这是一个好主意(如果不是什么是良好的做法在这种情况下)?
6条答案
按热度按时间jgwigjjp1#
Go语言似乎有一种特殊形式的switch专门用于此(它被称为 type switch):
p8ekf7hl2#
@Darius给出的答案是最惯用的(可能也是性能更高的)方法。一个限制是您要检查的类型必须是
interface{}
类型。如果你使用一个具体的类型,它将失败。另一种在运行时确定事物类型(包括具体类型)的方法是使用Go
reflect
包。将TypeOf(x).Kind()
链接在一起可以得到reflect.Kind
值,它是uint
类型:http://golang.org/pkg/reflect/#Kind然后,您可以检查switch块之外的类型,如下所示:
打印输出:
同样,这可能不是首选的方法,但知道替代方案是很好的。
sdnqo3pr3#
quux 00的答案只告诉了比较基本类型。
如果你需要比较你定义的类型,你不应该使用
reflect.TypeOf(xxx)
。使用reflect.TypeOf(xxx).Kind()
。有两类类型:
下面是一个完整的例子:
输出将是:
正如您所看到的,
reflect.TypeOf(xxx)
返回您可能想要使用的直接类型,而reflect.TypeOf(xxx).Kind()
返回基本类型。这就是结论。如果需要与基本类型进行比较,则使用
reflect.TypeOf(xxx).Kind()
;如果需要与自定义类型进行比较,则使用reflect.TypeOf(xxx)
。wfauudbj4#
请参见这里的类型Assert:
http://golang.org/ref/spec#Type_assertions
我只Assert一个合理的类型(string,uint64)等,并尽可能保持宽松,最后执行到本地类型的转换。
sauutmhj5#
怎么了
等等
unftdfkk6#
还有另一种方法可以Assert一个变量类型,如@MewX所评论的“direct types(您直接定义的类型)”。它是通过在比较中直接示例化类型。
deck{}
创建了类型的一个空示例,在本例中,是string
的一个空切片,比较工作正常。