Go语言如何在运行时检查变量类型

新手上路,请多包涵

我几乎没有像这样声明的 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{})

所以我需要能够在运行时检查 参数 类型。我该怎么做,这是个好主意吗(如果不是,在这种情况下什么是好的做法)?

原文由 Darius Kucinskas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

请在此处查看类型断言:

http://golang.org/ref/spec#Type_assertions

我会断言一个合理的类型(字符串,uint64)等,并尽可能保持松散,最后执行到本机类型的转换。

 func (e *Easy)SetOption(option Option, param interface{}) {
    if s, ok := param.(string); ok {
        // s is string here
    }
    // else...
}

原文由 Deleted 发布,翻译遵循 CC BY-SA 4.0 许可协议

似乎 Go 有特殊形式的 switch 专门用于此(称为 type switch ):

 func (e *Easy)SetOption(option Option, param interface{}) {

    switch v := param.(type) {
    default:
        fmt.Printf("unexpected type %T", v)
    case uint64:
        e.code = Code(C.curl_wrapper_easy_setopt_long(e.curl, C.CURLoption(option), C.long(v)))
    case string:
        e.code = Code(C.curl_wrapper_easy_setopt_str(e.curl, C.CURLoption(option), C.CString(v)))
    }
}

原文由 Darius Kucinskas 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏