Go递归解析深层嵌套JSON接口报错:unexpected return, expecting expression
解决Go递归函数中的语法错误:unexpected return, expecting expression
咱们先把这个错误里的「expecting expression」讲明白——Go编译器在碰到return语句的时候,期望后面跟着一个和函数返回类型匹配的合法表达式,但你的代码里不仅有语法违规的写法,还有类型逻辑的错误,导致编译器无法正确解析return后面的内容,所以抛出了这个报错。
先拆解你代码里的核心问题
看你写的这段代码:
func arrayReturn(m map[string]interface{}) []interface{} { for _, v:= range m { if v.(type) == map[string]interface{} { return arrayReturn(v.(map[string]interface{})) } if v.(type) == string { return v.([]interface{}) } } }
这里有三个直接触发错误的问题:
v.(type)的语法误用:v.(type)是Go里专门用于switch type语句的语法,不能直接放在if的条件判断里!编译器看到这个写法完全不知道该怎么解析,直接就报错说“expecting expression”。- 类型断言逻辑完全错误:第二个
if里你判断v是string类型,却强行把它断言成[]interface{}——这俩类型八竿子打不着,就算语法过了,运行时也会直接panic。 - 缺少默认返回路径:你的函数声明要返回
[]interface{},但如果循环遍历完所有元素都没找到符合条件的值,函数没有任何返回语句,这也是语法层面的问题。
修正后的代码示例
如果你的需求是递归遍历嵌套的map[string]interface{},找到第一个[]interface{}类型的值并返回,那可以改成下面这样:
func arrayReturn(m map[string]interface{}) []interface{} { for _, v := range m { // 用类型断言判断当前值是不是嵌套的map,ok表示断言成功与否 if subMap, ok := v.(map[string]interface{}); ok { // 递归调用子map,如果找到数组就返回 if arr := arrayReturn(subMap); arr != nil { return arr } } // 判断当前值是不是[]interface{}类型,是就直接返回 if arr, ok := v.([]interface{}); ok { return arr } } // 遍历完没找到,返回nil作为默认结果 return nil }
修正点说明
- 用
v.(T)配合ok的方式判断类型,这是Go中判断interface{}实际类型的标准写法(除了type switch) - 修正了逻辑:直接找目标类型
[]interface{},而不是错误地先判断string再强行转数组 - 给函数加了默认返回值
nil,保证所有代码路径都有符合返回类型的结果
内容的提问来源于stack exchange,提问作者Anoymouswho
相关产品推荐
相关产品推荐

