欢迎,来自IP地址为:18.97.9.175 的朋友
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() }