高朗接口类型的设计理念

实施Go接口是隐式完成的。在Go中,无需通过指定任何关键字将接口显式实现为具体类型。要将接口实现为具体类型,只需为方法提供接口类型中定义的相同签名即可。

接口类型由关键字interface定义。接口定义了一组方法(方法集),但是这些方法不包含代码:它们未实现(它们是抽象的)。方法集是类型必须具有的才能实现接口的方法的列表。接口也不能包含变量。

接口以以下格式声明

接口 Type 目录

type 目录 interface {
	shipping() float64
	tax() float64
}

接口类型目录是用于在目录中创建各种产品类型的合同。目录界面在其合同中提供了两种行为:运输和税收。

实施接口

以下源代码显示了 可配置的 type作为接口类型的实现 目录。的 可配置的 使用接收器方法将类型定义为结构 运输。这个事实自动符合条件 可配置的 作为实现 目录:

package main
import "fmt"

type 目录 interface { 
   运输() float64 
   税() float64
} 
 
type 可配置的 struct { 
   name string
   price, qty float64   
} 

func (c *configurable) 税() float64{
  return c.price * c.qty * 0.05
}

func (c *configurable) 运输() float64{
  return c.qty * 5
}

func  main() {
  tshirt := 可配置的{}
  tshirt.price = 250
  tshirt.qty = 2
  fmt.Println("Shipping Charge: ", tshirt.shipping())
  fmt.Println("Tax: ", tshirt.tax())  
}
运行该程序时,将得到以下输出:
C:\ golang>go run example.go
运费:10
税金:25

使用Go接口进行子类型化

使用通过接口的子类型构建对象时,请转到支持组合(具有)关系。这可以解释为 可配置的, 下载, 简单 类型(以及实现方法的任何其他类型 运输)可以视为目录的子类型,如下图所示:

实施接口

package main
import "fmt"

type 目录 interface { 
   运输() float64 
   税() float64
} 
 
type 可配置的 struct { 
   name string
   price, qty float64   
} 

func (c *configurable) 税() float64{
  return c.price * c.qty * 0.05
}

func (c *configurable) 运输() float64{
  return c.qty * 5
}

type 下载 struct{
    name string
    price, qty float64
}

func (d *download) 税() float64{
  return d.price * d.qty * 0.07
}

type 简单 struct {
  name string
  price, qty float64
}

func (s *simple) 税() float64{
  return s.price * s.qty * 0.03
}

func (s *simple) 运输() float64{
  return s.qty * 3
}

func  main() {
  tshirt := 可配置的{}
  tshirt.price = 250
  tshirt.qty = 2
  fmt.Println("可配置产品")
  fmt.Println("Shipping Charge: ", tshirt.shipping())
  fmt.Println("Tax: ", tshirt.tax())  

  mobile := 简单{"三星S-7",10,25}
  fmt.Println("\nSimple Product")  
  fmt.Println("Shipping Charge: ", mobile.shipping())
  fmt.Println("Tax: ", mobile.tax())  


  book := 下载{"24小时内使用Python",19,1}
  fmt.Println("\nDownloadable Product")
  fmt.Println("Tax: ", book.tax())
}
运行该程序时,将得到以下输出:
C:\ golang>go run example.go
可配置产品
运费:10
税金:25

简单产品
运费:75
税:7.5

可下载的产品
税:1.33

C:\ golang>

多种接口

在GO中,接口的隐式机制允许同时满足多种接口类型。这可以通过将给定类型的方法集与每种接口类型的方法相交来实现。让我们重新实现前面的代码。新介面 折扣 已经被创造了。如下图所示:

实现多个接口

package main
import "fmt"

type 目录 interface { 
   运输() float64 
   税() float64
} 

type 折扣 interface{
    offer() float64
}
 
type 可配置的 struct { 
   name string
   price, qty float64   
} 

func (c *configurable) 税() float64{
  return c.price * c.qty * 0.05
}

func (c *configurable) 运输() float64{
  return c.qty * 5
}

func (c *configurable) offer() float64{
  return c.price * 0.15
}

type 下载 struct{
    name string
    price, qty float64
}

func (d *download) 税() float64{
  return d.price * d.qty * 0.10
}

type 简单 struct {
  name string
  price, qty float64
}

func (s *simple) 税() float64{
  return s.price * s.qty * 0.03
}

func (s *simple) 运输() float64{
  return s.qty * 3
}

func (s *simple) offer() float64{
  return s.price * 0.10
}

func  main() {
  tshirt := 可配置的{}
  tshirt.price = 250
  tshirt.qty = 2
  fmt.Println("可配置产品")
  fmt.Println("Shipping Charge: ", tshirt.shipping())
  fmt.Println("Tax: ", tshirt.tax())  
  fmt.Println("Discount: ", tshirt.offer())  

  mobile := 简单{"三星S-7",3000,2}
  fmt.Println("\nSimple Product")  
  fmt.Println(mobile.name)
  fmt.Println("Shipping Charge: ", mobile.shipping())
  fmt.Println("Tax: ", mobile.tax())  
  fmt.Println("Discount: ", mobile.offer())

  book := 下载{"24小时内使用Python",50,1}
  fmt.Println("\nDownloadable Product")
  fmt.Println(book.name)
  fmt.Println("Tax: ", book.tax())
}
运行该程序时,将得到以下输出:
C:\ golang>go run example.go
可配置产品
运费:10
税金:25
折扣37.5

简单产品
三星S-7
运费:6
税金:180
优惠300

可下载的产品
24小时内使用Python
Tax: 5

C:\ golang>

接口嵌入

在GO中,接口类型还支持类型嵌入(类似于struct类型)。这使您可以灵活地以最大程度地重用类型的方式来构造类型。
Continuing with the 目录 例如,声明了一个可配置的结构,其中类型 折扣礼物包 被嵌入。在这里,您可以创建更多具体类型的 目录 接口。因为类型 礼物包折扣目录 接口,可配置的类型也是 目录 接口。类型中定义的所有字段和方法 折扣礼物包 类型也可在可配置类型中使用。
下图显示了如何组合接口类型,以便is-a关系仍然满足代码组件之间的关系:

实施接口嵌入

package main
import "fmt"

type 折扣 interface{
    offer() float64
}

type 礼物包 interface{
    available() string
}

type 目录 interface { 
   折扣
   礼物包
   运输() float64 
   税() float64
}

type 可配置的 struct { 
   name string
   price, qty float64   
} 

func (c *configurable) 税() float64{
  return c.price * c.qty * 0.05
}

func (c *configurable) 运输() float64{
  return c.qty * 5
}

func (c *configurable) offer() float64{
  return c.price * 0.15
}

func (c *configurable) available() string{
    if c.price > 1000{
      return "可用礼品包"
    }
    return "礼品包不可用"
}

type 下载 struct{
    name string
    price, qty float64
}

func (d *download) 税() float64{
  return d.price * d.qty * 0.10
}

func (d *download) available() string{
    if d.price > 500{
      return "可用礼品包"
    }
    return "礼品包不可用"
}

type 简单 struct {
  name string
  price, qty float64
}

func (s *simple) 税() float64{
  return s.price * s.qty * 0.03
}

func (s *simple) 运输() float64{
  return s.qty * 3
}

func (s *simple) offer() float64{
  return s.price * 0.10
}

func  main() {
  tshirt := 可配置的{}
  tshirt.price = 1550
  tshirt.qty = 2
  fmt.Println("可配置产品")
  fmt.Println("Shipping Charge: ", tshirt.shipping())
  fmt.Println("Tax: ", tshirt.tax())  
  fmt.Println("Discount: ", tshirt.offer())  
  fmt.Println(tshirt.available())

  mobile := 简单{"三星S-7",3000,2}
  fmt.Println("\nSimple Product")  
  fmt.Println(mobile.name)
  fmt.Println("Shipping Charge: ", mobile.shipping())
  fmt.Println("Tax: ", mobile.tax())  
  fmt.Println("Discount: ", mobile.offer())  

  book := 下载{"24小时内使用Python",50,1}
  fmt.Println("\nDownloadable Product")
  fmt.Println(book.name)
  fmt.Println("Tax: ", book.tax())
  fmt.Println(book.available())
}
运行该程序时,将得到以下输出:
C:\ golang>go run example.go
可配置产品
运费:10
税:155
折扣:232.5
可用礼品包

简单产品
三星S-7
运费:6
税金:180
优惠300

可下载的产品
24小时内使用Python
Tax: 5
礼品包不可用

C:\ golang>