接口的定义和实现:

package main

import "fmt"

type Humaner interface {
	sayhi()
}

type Student struct {
	id   int
	name string
}

type Teacher struct {
	addr  string
	group string
}

func (temp *Student) sayhi() {
	fmt.Printf("%d  %s\n", temp.id, temp.name)
}

func (temp *Teacher) sayhi() {
	fmt.Printf("%s %s\n", temp.addr, temp.group)
}

func main() {
	var i Humaner
	s := &Student{12, "haha"}
	i = s
	i.sayhi()

	t := &Teacher{"aaaa", "bbbb"}
	i = t
	i.sayhi()
}

多态:

package main

import "fmt"

type Humaner interface {
	sayhi()
}

type Student struct {
	id   int
	name string
}

type Teacher struct {
	addr  string
	group string
}

func (temp *Student) sayhi() {
	fmt.Printf("%d  %s\n", temp.id, temp.name)
}

func (temp *Teacher) sayhi() {
	fmt.Printf("%s %s\n", temp.addr, temp.group)
}

func WhoSayHi(i Humaner) {
	i.sayhi()
}

func main() {
	s := &Student{1, "demo"}
	t := &Teacher{"aaaa", "bbbbb"}

	WhoSayHi(s)
	WhoSayHi(t)

	x := make([]Humaner, 2)
	x[0] = s
	x[1] = t

	for _, i := range x {
		i.sayhi()
	}
}

接口继承:

package main

import "fmt"

type Student struct {
	name string
	id   int
}

type Humaner interface {
	sayhi()
}

type Personer interface {
	Humaner
	sing(lrc string)
}

func (s *Student) sayhi() {
	fmt.Println("sayhi", s.name, s.id)
}

func (s *Student) sing(lrc string) {
	fmt.Println("sing", s.name, s.id, lrc)
}

func main() {
	var i Personer
	s := &Student{"aaa", 1}
	i = s
	i.sayhi()
	i.sing("dddddd")
}

空接口:

package main

import "fmt"

// 可以传递任意类型的参数
func Abc(arg ...interface{}) {
	fmt.Println(arg)
}

func main() {
	// 可以保存任意类型的值
	var i interface{} = 1
	fmt.Println(i)

	i = "abc"
	fmt.Println(i)

	Abc("deddee", 123, "hahahah")
}

通过 if 判断类型:

package main

import "fmt"

type Student struct {
	id   int
	name string
}

func main() {
	i := make([]interface{}, 3)
	i[0] = 1
	i[1] = "hello"
	i[2] = Student{666, "hahahah"}

	for index, data := range i {
		if value, ok := data.(int); ok == true {
			fmt.Println(index, value)
		} else if value, ok := data.(string); ok == true {
			fmt.Println(index, value)
		} else if value, ok := data.(Student); ok == true {
			fmt.Println(index, value)
		}
	}
}

通过switch判断类型:

package main

import "fmt"

type Student struct {
	id   int
	name string
}

func main() {
	i := make([]interface{}, 3)
	i[0] = 1
	i[1] = "hello"
	i[2] = Student{666, "hahahah"}

	for index, data := range i {
		switch value := data.(type) {
		case int:
			fmt.Println(index, value)
		case string:
			fmt.Println(index, value)
		case Student:
			fmt.Println(index, value)
		}
	}
}