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这样的关键字
注意事项
- 
接口本身不能创建实例, 但是可以指向一个实现了该接口的自定义类型的变量 
- 
接口中所有的方法都没有方法体 
- 
一个自定义类型需要将某个接口的所有方法都实现,我们就说这个自定义类型实现了该接口 
- 
一个自定义类型可以实现多个接口 
- 
Go中接口不能有任何变量 
- 
和Java相同的,接口支持多继承,一个接口可以继承多个接口 
- 
只要是自定义数据类型,就可以实现接口, 不仅仅是接口体 //定义一个接口 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() }
- 
interface类型默认是一个指针(引用类型),如果没有对interface初始化,那么输出nil
- 
空接口 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)
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号