Go语言接口如何应用?0基础学go

    /    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)

分享至