Go语言接口典型示例分析

欢迎您,来自IP地址为:54.227.51.103的朋友

付款前,可以输入宝贝名称查一查有没有优惠券可以用哦!


Go语言不是一种“传统”的面向对象的编程语言:它里面没有类和继承的概念。

但是Go语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来说明对象的行为:如果谁能搞定这件事,它就可以用在这儿。

接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的),接口里也不能包含变量。

不象大多数面向对象编程语言,在Go语言中接口可以有值,一个接口类型的变量或一个接口值,它本质上一个指针。指向接口值的指针也同样是非法的。

Go语言一个很典型的例子就是来自标准库的sort包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的Len()方法,比较第i个和j个元素的Less( i , j )方法以及交换第i个和第j个元素的Swap( i , j )方法。

首先定义了一个Sorter包用于定义sorter接口包,并给sorter数据定义了sort方法和issorted方法:

//sorter.go
package sorter

type Sorter interface {
   Len () int
   Less (i,j int) bool
   Swap (i,j int)
}

func Sort(data Sorter)  {
   for pass :=1;pass < data.Len();pass ++{
      for i :=0;i<data.Len()-pass;i++{
         if data.Less(i+1,i){
            data.Swap(i,i+1)
         }
      }
   }
}

func IsSorted(data Sorter) bool  {
   n:=data.Len()
   for i :=n-1;i>0;i--{
      if data.Less(i,i-1){
         return false
      }
   }
   return true
}

type IntArrary []int

func (p IntArrary) Len() int  {
   return len(p)
}
func (p IntArrary) Less(i,j int) bool  {
   return p[i]<p[j]
}
func (p IntArrary) Swap(i,j int)  {
   p[i],p[j] =p[j],p[i]
}

type StrArrary []string

func (p StrArrary) Len() int  {
   return len(p)
}
func (p StrArrary) Less(i,j int) bool  {
   return p[i]<p[j]
}
func (p StrArrary) Swap(i,j int)  {
   p[i],p[j] =p[j],p[i]
}

func SortIns(a []int) {
   Sort(IntArrary(a))
}
func SortStrings( a []string)  {
   Sort(StrArrary(a))
}

func IntArrSorted(a []int) bool  {
   return IsSorted(IntArrary(a))
}
func StrArrSorted(a []string)bool  {
   return IsSorted(StrArrary(a))
}

在示例的主程序包中定义了另一个dayArray结构体,并在主程序中为这个结构体定义了Len()、Less()和Swap()函数,此时,由于dayArray类型数据实现了接口Sorter的所有方法,那么它就可以调用sorter类型的所有方法。

//sortmain.go
package main

import (
   "sorter"
   "fmt"
)

func ints()  {
   data := []int {74,59,28,-98,356,-645,32,669,-23,98675}
   a := sorter.IntArrary(data)
   sorter.Sort(a)
   if !sorter.IsSorted(a) {
      panic("Int sort failed!")
   }
   fmt.Printf("The sorted arrary is : %v\n",a)
}

func strings()  {
   data := []string{"monday","friday","tuesday","wednesday","sunday","thursday","saturday"}
   a := sorter.StrArrary(data)
   sorter.Sort(a)
   if !sorter.IsSorted(a){
      panic("Str sort failed!")
   }
   fmt.Printf("The sorted arrary is : %v\n",a)
}

type day struct {
   num int
   shortName string
   longName string
}
type dayArray struct {
   data []*day
}

func (p *dayArray) Len() int  {
   return len(p.data)
}
func (p *dayArray) Less(i,j int ) bool  {
   return p.data[i].num<p.data[j].num
}
func (p *dayArray) Swap(i,j int)  {
   p.data[i],p.data[j]=p.data[j],p.data[i]
}

func days()  {
   Sunday :=day{0,"SUN","Sunday"}
   Monday :=day{1,"MON","Monday"}
   Tuesday :=day{2,"TUE","Tuesday"}
   Wednesday :=day{3,"WED","Wednesday"}
   Thursday :=day{4,"THU","Thursday"}
   Friday :=day{5,"FRI","Friday"}
   Saturday :=day{6,"SAT","Saturday"}

   data :=[]*day{&Monday,&Wednesday,&Saturday,&Friday,&Tuesday,&Sunday,&Thursday}
   a := dayArray{data}
   sorter.Sort(&a)
   if !sorter.IsSorted(&a){
      panic("Day arr sort failed!")
   }
   for _,d := range data{
      fmt.Printf("%s  ",d.longName)
   }
   fmt.Printf("\n")
}

func main() {
   ints()
   strings()
   days()
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注