/ 2019-03-18
接口嵌套
接口可以匿名嵌入其他接口,或嵌入到结构中。如果一个interface1作为interface2的一个嵌入字段,那么interface2隐式的包含了interface1里面的方法。
package main
import (
"fmt"
)
type Info interface {
Age
Name
}
type Age interface {
GetAge() int
}
type Name interface {
GetName() string
}
type User struct {
name string
age int
}
func (u User) GetAge() int {
return u.age
}
func (u User) GetName() string {
return u.name
}
func main() {
user := User{"oldboy", 18}
var u Info
u = user
age := u.GetAge()
name := u.GetName()
fmt.Println(age, name)
}
匿名接口可用作变量类型,或结构成员。
package main
import "fmt"
type Info struct {
u interface {
GetUser() string
}
}
type User struct {
id int
name string
}
func (self *User) GetUser() string {
return fmt.Sprintf("user %d, %s", self.id, self.name)
}
func main() {
t := Info{&User{18, "oldboy"}}
fmt.Println(t.u.GetUser())
}
接口检查
超集接口对象可转换为子集接口,反之出错。
package main
import "fmt"
type Stringer interface {
String() string
}
type Printer interface {
String() string
Print()
}
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("%d, %v", self.id, self.name)
}
func (self *User) Print() {
fmt.Println(self.String())
}
func main() {
var o Printer = &User{18, "oldboy"}
var s Stringer = o
fmt.Println(s.String())
}
接口技巧
让编译器检查,以确保某个类型实现接口。
package main
import "fmt"
type Data struct {
id int
name string
}
func (self *Data) String() string {
return fmt.Sprintf("%d, %s", self.id, self.name)
}
func main() {
var _ fmt.Stringer = (*Data)(nil)
}
某些时候,让函数直接 "实现" 接口能省不少事。
package main
type Tester interface {
Do()
}
type FuncDo func()
func (self FuncDo) Do() { self() }
func main() {
var t Tester = FuncDo(func() { println("Hello, World!") })
t.Do()
}
(0)