将空接口转换为 Golang 中的等效类型
Cast emtpy interface to its equivalent type in Golang
将动态接口转换为其等效类型。例如,如果值是 int 它应该 return int 如果是字符串那么它应该 return int.
代码示例:
var options = bson.M{}
for _, val := range conditions {
var attr, operator, value interface{}
cons := val.(map[interface{}]interface{})
for range cons {
attr = cons["attribute"]
operator = cons["operator"]
value = cons["value"]
switch operator {
case "==":
operator = "$eq"
case "!=":
operator = "$ne"
case "()":
operator = "$in"
value = []string{fmt.Sprintf("%v", value)}
}
options[attr.(string)] = bson.M{operator.(string): value.
(int)}
}
}
条件格式如下。
conditions []interface{}
cons = append(cons, map[interface{}]interface{}{"attribute":
"discontinued", "operator": "!=", "value": 1})
cons = append(cons, map[interface{}]interface{}{"attribute": "status",
"operator": "==", "value": 1})
cons = append(cons, map[interface{}]interface{}{"attribute":
"visibility", "operator": "==", "value": 4})
但是 "value": 4 OR "value": 1 是无法确认的。
抛出错误: 接口转换:接口{}是字符串,不是int
您可以使用类型断言实现递归以获取接口的基础值。实现一个 Switch case,然后递归调用它,直到找到未知类型的原始类型。因为如果你在界面内解析任何东西,它肯定是以下类型。
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays // slice of interface{}
map[string]interface{}, for JSON objects
nil for JSON null
检查以下有关如何实施该方法的代码。
package main
import (
"fmt"
)
func main() {
res, err := g.Execute( // Sends a query to Gremlin Server with bindings
"g.V(x)",
map[string]string{"x": "1234"},
map[string]string{},
)
if err != nil {
fmt.Println(err)
return
}
fetchValue(res)
}
func fetchValue(value interface{}) {
switch value.(type) {
case string:
fmt.Printf("%v is an interface \n ", value)
case bool:
fmt.Printf("%v is bool \n ", value)
case float64:
fmt.Printf("%v is float64 \n ", value)
case []interface{}:
fmt.Printf("%v is a slice of interface \n ", value)
for _, v := range value.([]interface{}) { // use type assertion to loop over []interface{}
fetchValue(v)
}
case map[string]interface{}:
fmt.Printf("%v is a map \n ", value)
for _, v := range value.(map[string]interface{}) { // use type assertion to loop over map[string]interface{}
fetchValue(v)
}
default:
fmt.Printf("%v is unknown \n ", value)
}
}
将动态接口转换为其等效类型。例如,如果值是 int 它应该 return int 如果是字符串那么它应该 return int.
代码示例:
var options = bson.M{}
for _, val := range conditions {
var attr, operator, value interface{}
cons := val.(map[interface{}]interface{})
for range cons {
attr = cons["attribute"]
operator = cons["operator"]
value = cons["value"]
switch operator {
case "==":
operator = "$eq"
case "!=":
operator = "$ne"
case "()":
operator = "$in"
value = []string{fmt.Sprintf("%v", value)}
}
options[attr.(string)] = bson.M{operator.(string): value.
(int)}
}
}
条件格式如下。
conditions []interface{}
cons = append(cons, map[interface{}]interface{}{"attribute":
"discontinued", "operator": "!=", "value": 1})
cons = append(cons, map[interface{}]interface{}{"attribute": "status",
"operator": "==", "value": 1})
cons = append(cons, map[interface{}]interface{}{"attribute":
"visibility", "operator": "==", "value": 4})
但是 "value": 4 OR "value": 1 是无法确认的。
抛出错误: 接口转换:接口{}是字符串,不是int
您可以使用类型断言实现递归以获取接口的基础值。实现一个 Switch case,然后递归调用它,直到找到未知类型的原始类型。因为如果你在界面内解析任何东西,它肯定是以下类型。
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays // slice of interface{}
map[string]interface{}, for JSON objects
nil for JSON null
检查以下有关如何实施该方法的代码。
package main
import (
"fmt"
)
func main() {
res, err := g.Execute( // Sends a query to Gremlin Server with bindings
"g.V(x)",
map[string]string{"x": "1234"},
map[string]string{},
)
if err != nil {
fmt.Println(err)
return
}
fetchValue(res)
}
func fetchValue(value interface{}) {
switch value.(type) {
case string:
fmt.Printf("%v is an interface \n ", value)
case bool:
fmt.Printf("%v is bool \n ", value)
case float64:
fmt.Printf("%v is float64 \n ", value)
case []interface{}:
fmt.Printf("%v is a slice of interface \n ", value)
for _, v := range value.([]interface{}) { // use type assertion to loop over []interface{}
fetchValue(v)
}
case map[string]interface{}:
fmt.Printf("%v is a map \n ", value)
for _, v := range value.(map[string]interface{}) { // use type assertion to loop over map[string]interface{}
fetchValue(v)
}
default:
fmt.Printf("%v is unknown \n ", value)
}
}