如何检查变量是否为字符串/整数/浮点数并转换指定Map类型?
Go 类型检查与Map转换问题解答
1. 检查变量是否为string/int/float类型
在Go中,判断变量类型最常用的两种方式是类型断言和type switch:
方式一:类型断言(适合单次类型判断)
var v interface{} = "test" // 判断是否为string if s, ok := v.(string); ok { println("类型为string,值:", s) } // 判断是否为int if i, ok := v.(int); ok { println("类型为int,值:", i) } // 判断是否为float64(Go默认浮点数类型为float64) if f, ok := v.(float64); ok { println("类型为float64,值:", f) }
注意:如果需要支持float32,需要单独添加对应断言分支。
方式二:type switch(适合多类型分支判断)
var v interface{} = 3.14 switch val := v.(type) { case string: println("类型:string,值:", val) case int: println("类型:int,值:", val) case float64: println("类型:float64,值:", val) default: println("不支持的类型:", val) }
2. 将map[string]interface{}转为map[string]string(仅支持string/int,其他类型返回错误)
你之前用value, ok := v.(string)断言int失败,是因为类型断言是精确匹配的。要实现需求,可以写一个转换函数,遍历原map并针对允许的类型做处理:
import ( "fmt" "strconv" ) func ConvertToStrMap(src map[string]interface{}) (map[string]string, error) { dst := make(map[string]string, len(src)) for key, val := range src { switch v := val.(type) { case string: dst[key] = v case int: dst[key] = strconv.Itoa(v) // 若需要支持浮点数,可添加以下分支 // case float64: // dst[key] = strconv.FormatFloat(v, 'f', -1, 64) default: return nil, fmt.Errorf("key %q 的值类型不支持:%T", key, val) } } return dst, nil }
使用示例
func main() { srcMap := map[string]interface{}{ "username": "clarkk", "level": 10, // "score": 95.5, // 若开启此注释,需在转换函数中添加float64分支,否则会返回错误 } strMap, err := ConvertToStrMap(srcMap) if err != nil { panic(err) } // 输出:clarkk 10 println(strMap["username"], strMap["level"]) }
这个函数会:
- 直接保留string类型的值
- 将int类型的值转为string存入目标map
- 遇到其他类型(如float、bool、结构体等)时,立即返回错误
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

