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 關注
- 204 瀏覽
添加回答
舉報
