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