1、接口
1.1 概念
- 在 Go 语言中,接口是一种抽象类型,用于定义一组方法签名而不提供方法的实现。接口的核心理念是描述行为,而具体的行为实现由实现接口的类型提供。接口在 Go 语言中广泛用于实现多态性、松耦合和代码复用。
1.2 声明
            
            
              go
              
              
            
          
          //声明一个接口类型,接口名为Person
type Person interface {
    //接口对外暴露两个方法
    Say(string) string
    Walk(int)
}1.3 初始化
- 所谓接口,仅仅定义了一组规范,所以单单接口是无法初始化的,没有具体的实现。
            
            
              go
              
              
            
          
          package main
import "fmt"
type Person interface {
	Name() string
	Age() int
}
func main() {
  //单接口无法初始化
  var p Person
  fmt.Println(p) //输出nil
}1.4 接口的实现
- 
场景 一家建筑公司,需要一台起重机,然后出了一份关于起重机的规范( 接口),A公司接下了订单,根据建筑公司起重机的规范和自己的技术,造了起重机A(实现);后面建筑公司和A公司不合作,又找了个B公司,B公司也根据规范和自己的技术,造了起重机B(实现),其实建筑公司在使用起重机的方式和以前一样的。
- 
go的接口实现示例 gopackage main import "fmt" //起重机接口,建筑公司定义的规范 type Crane interface { JackUp() string Hoist() string } //起重机制造公司A type CraneA struct { name string } //公司A实现起重机规范 func (c *CraneA) JackUp() string { return c.name + "======JackUp!!!!!" } //公司A实现起重机规范 func (c *CraneA) Hoist() string { return c.name + "======hoist!!!!!" } //起重机制造公司B type CraneB struct { name string des string } //公司B实现起重机规范 func (c *CraneB) JackUp() string { return c.name + "======JackUp!!!!!使用" + c.des } //公司B实现起重机规范 func (c *CraneB) Hoist() string { return c.name + "======hoist!!!!!使用" + c.des } //建筑公司 type ConstructionCompany struct { name string Crane Crane } //建筑公司改变起重机制造公司 func (c *ConstructionCompany) changeCrane(crane Crane) { c.Crane = crane } func main() { cc := &ConstructionCompany{"建筑公司", &CraneA{"起重机A"}} fmt.Println(cc.Crane.JackUp()) fmt.Println(cc.Crane.Hoist()) cc.changeCrane(&CraneB{"起重机B", "B公司独家技术专利"}) fmt.Println(cc.Crane.JackUp()) fmt.Println(cc.Crane.Hoist()) }
- 
在Go中接口的实现是隐式的,不用像Java使用 implements关键字实现接口,只要结构体有接口定义的所有方法,就说明该结构体实现了该接口。
1.5 空接口
            
            
              go
              
              
            
          
          type Any interface{
}- Any接口内部没有方法集合,按实现的定义,所有的类型都是Any接口的实现,因为所有类型的方法集都是空集的超集,所以Any接口可以保存任何类型的值。