我正在编写类型断言辅助方法,它接受interface{}
并返回string
和map[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
}
答案 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
}