golang接口细节和注意事项

package main

import "fmt"

/*
	interface类型可以定义一组方法,但是这些不需要实现
	并且interface不能包含任何变量
	到某个自定义类型要使用的时候,再根据具体情况把这些方法写出来

	基本语法
	type 接口名 interface{
		method1(参数列表)返回值列表
		method2(参数列表)返回值列表
	}
	func(t 自定义类型)method1(参数列表)返回值列表{
		//方法实现
	}
	func(t 自定义类型)method2(参数列表)返回值列表{
		//方法实现
	}

	接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想
	Golang中的接口不需要显示的实现,只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口
*/
/*
	注意事项
	1.接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
	2.接口中所有的方法都没有方法体,即都是没有实现的方法
	3.在golang中一个自定义类型需将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口
	4.只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型
	5.一个自定义类型可以实现多个接口
	6.Golang接口中不能有任何变量
	7.一个接口A可以继承多个别的接口BC,这时如果要实现A接口,也必须将BC接口的方法全部实现
	8.interface类型默认是一个指针(),如果没有对interface初始化就使用,那么会输出nil
	9.空接口interface{}没有任何方法,所以所有类型都实现了空接口,可以把任何一个变量赋给空接口
*/
type AInterface interface {
	Say()
} //定义A接口
type BInterface interface {
	Hello()
} //定义B接口
type Stu struct {
	Name string
}

func (stu Stu) Say() {
	fmt.Println("Stu Say()")
}

type integer int

func (i integer) Say() {
	fmt.Println("integer Say i=", i)
}

type Monster struct {
}

func (monster Monster) Hello() {
	fmt.Println("Monster Hello()")
}
func (monster Monster) Say() {
	fmt.Println("Monster Say()")
}

type employ interface {
} //空接口

func main() {

	var stu Stu //结构体变量,实现了Say() 实现了AInterface
	var a AInterface = stu
	a.Say()

	var i integer = 10
	var b AInterface = i
	b.Say()

	//Monster实现了AInterface和BInterface
	var monster Monster
	var a2 AInterface = monster
	var b2 BInterface = monster
	a2.Say()
	b2.Hello()

	//任何变量都可以赋给空接口
	var em employ = stu
	fmt.Println(em)
	var num1 float64 = 8.8
	em = num1
	fmt.Println(em)
}

  

posted @ 2022-03-10 16:32  Star_Gazer  阅读(77)  评论(0编辑  收藏  举报