如何处理在switch case语句中返回两个对象

时间:2018-04-19 15:03:45

标签: go

我正在编写类型断言辅助方法,它接受interface{}并返回stringmap[string]interface{}。我在case语句中返回两个对象。为什么要求在功能结束时返回?我错过了休息吗?

func typeAssertionHelper(r interface{}) (string, map[string]interface{}) {
    switch g := r.(type) {
    case string:
        return g, nil
    case []interface{}:
        for _, v := range g {
            switch s := v.(type) {
            case string:
                return s, nil
            case map[string]interface{}:
                return "", s
            }
        }
    }
    // missing return end of function
}

2 个答案:

答案 0 :(得分:1)

传入的r interface{}不一定与switch块中的一个案例相匹配。

Essentailly switch并非详尽无遗。

您可以使用默认案例扩展switch

switch g := r.(type) {
 case string:
     ...
 case []interface{}:
     ...
 default:
     ...
}

或者只是在函数末尾返回一些内容

return "", nil

答案 1 :(得分:0)

在函数的位置添加一个nil值的返回值。由于您从函数返回,因此您应该在函数结束时返回。

package main

import (
    "fmt"
    "runtime"
)

func Do() string{
    fmt.Print("Go runs on ")
    switch os := runtime.GOOS; os {
    case "darwin":
        return "darwin" 
    case "linux":
        return "linux" 
    default:
        // freebsd, openbsd,
        // plan9, windows...
        return fmt.Sprintf("%s.", os)
    }
    return "OS"
}

func main() {
    value := Do()
    fmt.Println(value)
}

或者你可以做的是在函数的末尾有一个return语句。但是在每种情况下都要分配一个值。

func Do() string{
    fmt.Print("Go runs on ")
    var value string
    switch os := runtime.GOOS; os {
    case "darwin":
        value = "darwin" 
    case "linux":
        value = "linux" 
    default:
        // freebsd, openbsd,
        // plan9, windows...
        value = fmt.Sprintf("%s.", os)
    }
    return value
}