2 回答
TA贡献1943条经验 获得超7个赞
我通常使用这样的模式。我创建了一个通用的Result类型,它存储作为接口的Data和作为错误类型的Err 。所以我可以重用 Result 类型来返回不同类型的不同函数。然后使用switch type来确定函数返回什么类型。Go Playground 请查看https://play.golang.org/p/SbwGOP_aXLG
package main
import (
"fmt"
"errors"
"os"
)
func main() {
what := "multiple"
result := Func(what)
if result.Err != nil {
fmt.Println(result.Err.Error())
os.Exit(1)
}
switch res := result.Data.(type) {
case Gopher:
fmt.Println("Gopher name : ", res.Name)
case Gophers:
for _, g := range res {
fmt.Println("Gopher name : ", g.Name)
}
}
}
type Result struct {
Data interface{}
Err error
}
type Gopher struct {
Name string
}
type Gophers []Gopher
func Func(what string) Result {
switch what {
case "one":
return Result{Data: Gopher{"gopher one"}}
case "multiple":
return Result{Data: Gophers{Gopher{"gopher one"}, Gopher{"gopher two"}}}
}
return Result{Err: errors.New("invalid what")}
}
TA贡献1155条经验 获得超0个赞
像这样的东西?语言规范中描述了类型开关。请参阅https://golang.org/ref/spec#Switch_statements。
package main
import "fmt"
func main() {
p := BasedOnType(true)
fmt.Println(p) //map[bool:true]
p = BasedOnType(2)
fmt.Println(p) //map[]
}
func BasedOnType(i interface{}) map[interface{}]interface{} {
m := make(map[interface{}]interface{})
switch x := i.(type) {
case bool, float64, string:
k := fmt.Sprintf("%T", x)
v := fmt.Sprintf("%v", x)
m[k] = v
return m
default:
return m
}
}
对于 Go 游乐场,请参阅https://play.golang.org/p/0ahpua7ujb2。
- 2 回答
- 0 关注
- 141 浏览
添加回答
举报