我正在学习中Go,文档和交互式课程说,空interface可以容纳任何类型,因为它不需要其他实现的方法。
Go
interface
举个例子:
func describe(i interface{}) { fmt.Printf("Type: %T | Value: %v\n", i, i) }
…将打印出来…
"Type: int | Value: 5" // for i := 5 "Type: string | Value: test" // for i := "test" ... etc
因此,我想我的问题是这是Go's实现通用函数的方法,还是还有另一种更合适的方法来实现它们。
Go's
Go范式通常是通过在非空接口中实现行为来避免这种情况。例如,假设您要打印特定于类型的格式的内容:
func Print(i interface{}) { switch o := i.(type) { case int64: fmt.Printf("%5d\n", o) case float64: fmt.Printf("%7.3f\n", o) case string: fmt.Printf("%s\n", o) default: // covers structs and such fmt.Printf("%+v\n", o) } }
或者,您可以为知道如何进行字符串自身设置的接口定义一个接口(该接口在库中以形式存在fmt.Stringer),并使用该接口:
fmt.Stringer
type Stringer interface { String() string } func Print(o Stringer) { fmt.Println(o.String()) } type Foo struct { a, b int } func (f Foo) String() string { // Let's use a custom output format that differs from %+v return fmt.Sprintf("%d(%d)", f.a, f.b) } type Bar struct { t bool } func (b Bar) String() string { if b.t { return "TRUE! =D" } return "false =(" }
https://play.golang.org/p/Ez6Hez6cAv
这使您具有类似泛型的功能,但仍保留类型安全性,并且行为本身 由type 定义,而不是 由 泛型函数定义。
Go鼓励您以这种方式根据类型的行为,可以 做什么 而不是 包含的内容 来思考类型。