2 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
我通常使用這樣的模式。我創(chuàng)建了一個(gè)通用的Result類型,它存儲(chǔ)作為接口的Data和作為錯(cuò)誤類型的Err 。所以我可以重用 Result 類型來返回不同類型的不同函數(shù)。然后使用switch type來確定函數(shù)返回什么類型。Go Playground 請(qǐng)查看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貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊
像這樣的東西?語言規(guī)范中描述了類型開關(guān)。請(qǐng)參閱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
}
}
對(duì)于 Go 游樂場,請(qǐng)參閱https://play.golang.org/p/0ahpua7ujb2。
- 2 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報(bào)