Golang 接口

Golang 接口

案例

//定义一个接口
type Usb interface {
	start()
	stop()
	sum(int, int) int
}
type phone struct {
}
//实现接口方法
func (p phone) start() {
	fmt.Println("implement phone start")
}

func (p phone) stop() {
	fmt.Println("implement phone stop")
}

func (p phone) sum(i int, i2 int) int {
	return i + i2
}

//多态
func method(usb Usb) {
	usb.start()
	usb.stop()
}
func main() {
	p := phone{}
	//多态
	method(p)
}

定义

interface可以定义一组方法,但是这些不需要实现。并且interface不能包含变量

GO中接口不需要显示的实现,只要一个自定义数据类型,含有接口类型中所有的方法,那么这个自定义数据类型就实现这个接口。因此,Go中没有implement这样的关键字

注意事项

  1. 接口本身不能创建实例, 但是可以指向一个实现了该接口的自定义类型的变量

  2. 接口中所有的方法都没有方法体

  3. 一个自定义类型需要将某个接口的所有方法都实现,我们就说这个自定义类型实现了该接口

  4. 一个自定义类型可以实现多个接口

  5. Go中接口不能有任何变量

  6. 和Java相同的,接口支持多继承,一个接口可以继承多个接口

  7. 只要是自定义数据类型,就可以实现接口, 不仅仅是接口体

    //定义一个接口
    type person interface {
    	say()
    }
    type Integer int
    //Integer实现person接口
    func (i Integer) say() {
    	fmt.Println("implement person say")
    }
    func main() {
    	var num Integer = 10
    	num.say()
    }
    
  8. interface类型默认是一个指针(引用类型),如果没有对interface初始化,那么输出nil

  9. 空接口interface{}没有任何方法,所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口(包括基本变量

    type T interface {
    
    }
    func  name(i T)  {
    	fmt.Println("hello world")
    }
    func main() {
    	var num int = 1
    	name(num) 
    }
    

例子

type Hero struct {
	Name string
	Age  int
}
type heroSlice []Hero

func (h heroSlice) Len() int {
	return len(h)
}

//从大到小, 最大堆, 每次都将比h[j].Age大放在队列头,成为下一个h[j]
func (h heroSlice) Less(i, j int) bool {
	//i是比较的元素,j是被比较的元素
	return h[i].Age > h[j].Age
}

func (h heroSlice) Swap(i, j int) {
	tmp := h[i]
	h[i] = h[j]
	h[j] = tmp
}

func main() {
	slices := heroSlice{
		Hero{"张三", 2},
		Hero{"李四", 23},
		Hero{"王五",1},
	}
	fmt.Println(slices)
	sort.Sort(slices)
	fmt.Println(slices)
}
posted @ 2020-08-12 17:53  CyberPelican  阅读(149)  评论(0编辑  收藏  举报