gpt4 book ai didi

go - 非导出类型的类型断言

转载 作者:IT王子 更新时间:2023-10-29 01:51:47 27 4
gpt4 key购买 nike

我正在使用第 3 方包,它允许您通过导出函数创建特定非导出类型的结构。

package squirrel

type expr struct {
sql string
args []interface{}
}

func Expr(sql string, args ...interface{}) expr {
return expr{sql: sql, args: args}
}

由于这个库的一些其他函数接受数据的方式,我最终得到了这样一张 map :

m := map[string]interface{} {
"col1": 123,
"col2": "a_string",
"col3": Expr("now()"),
}

但是由于这个库中的函数不同,我需要从这个 map 中过滤掉所有 squirrel.expr

显然,我无法通过这样做直接断言类型:

filtered := make(map[string]interface{})
for k, v := range m {
switch v.(type) {
case squirrel.expr:
continue
default:
filtered[k] = v
}
}

是否有其他方法可以达到同样的效果?

最佳答案

您可以使用反射将值的类型与 squirrel.expr 的类型进行比较。此处键入表示 reflect.Type描述符,由 reflect.TypeOf() 获取.

例如:

m := map[string]interface{}{
"col1": 123,
"col2": "a_string",
"col3": squirrel.Expr("now()"),
}
fmt.Println(m)

exprType := reflect.TypeOf(squirrel.Expr(""))

filtered := make(map[string]interface{})
for k, v := range m {
if reflect.TypeOf(v) == exprType {
continue
}
filtered[k] = v
}
fmt.Println(filtered)

这将输出:

map[col1:123 col2:a_string col3:{now() []}]
map[col1:123 col2:a_string]

注意:

我们通过传递 squirrel.Expr() 调用的返回值(类型为squirrel.expr)。在这种情况下这很好,但是如果仅仅为了获取类型而调用此函数是不可行的(例如,调用具有必须避免的副作用),我们可以避免这种情况。我们可以通过反射获取squirrel.Expr函数本身的reflect.Type描述符,获取其返回类型的类型描述符。这是可以做到的:

exprType := reflect.TypeOf(squirrel.Expr).Out(0)

关于go - 非导出类型的类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com