详解Golang语言中的interface
interface是一组method签名的组合,interface可以被任意对象实现,一个对象也可以实现多个interface。任意类型都实现了空interface(也就是包含0个method的interface),空interface可以存储任意类型的值。interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。
goversiongo1.12
packagemain import( "fmt" ) //定义struct typeHumanstruct{ namestring ageint phonestring } typeStudentstruct{ Human//匿名字段 schoolstring loanfloat32 } typeEmployeestruct{ Human//匿名字段 companystring moneyfloat32 } //Human对象实现SayHi()方法 func(hHuman)SayHi(){ fmt.Printf("Hi,Iam%s,youcancallmeon%s\n",h.name,h.phone) } //Human对象实现Sing()方法 func(hHuman)Sing(lyricsstring){ fmt.Println("Lalala...",lyrics) } //Human对象实现Guzzle()方法 func(hHuman)Guzzle(beerSteinstring){ fmt.Println("GuzzleGuzzleGuzzle...",beerStein) } //Employee对象重写SayHi()方法 func(eEmployee)SayHi(){ fmt.Printf("HiIam%s,Iworkat%s.Callmeon%s\n",e.name,e.company,e.phone) } //Student对象实现BorrowMoney()方法 func(sStudent)BorrowMoney(amountfloat32){ s.loan+=amount } //Employee对象实现SpendSalary()方法 func(eEmployee)SpendSalary(amountfloat32){ e.money-=amount } //定义interface,interface是一组method签名的组合 //interface可以被任意对象实现,一个对象也可以实现多个interface //任意类型都实现了空interface(也就是包含0个method的interface) //空interface可以存储任意类型的值 //interfaceMen的3个method被Human,Student,Employee实现,也就是这3个对象都实现了interfaceMen。即: //interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口。 typeMeninterface{ SayHi() Sing(lyricestring) Guzzle(beerSteinstring) } //interfaceYoungChap的BorrowMoney()method只被Student对象实现,也就是只有Student实现了YoungChap typeYoungChapinterface{ SayHi() Sing(songstring) BorrowMoney(amountfloat32) } //interfaceElderlyGent的SpendSalary()method只被Employee对象实现,也就是只有Employee实现了ElderlyGent typeElderlyGentinterface{ SayHi() Sing(songstring) SpendSalary(amountfloat32) } funcmain(){ //定义Student类型的变量 lucy:=Student{Human{"lucy",19,"10086"},"tsinghua",100.00} lily:=Student{Human{"lily",19,"10086"},"tsinghua",100.00} liming:=Student{Human{"liming",19,"10086"},"tsinghua",100.00} //定义Employee类型的变量 tom:=Employee{Human{"tom",29,"10000"},"Google",200.00} //定义Men类型的变量i variMen //i存储Student i=lucy fmt.Println("Thisislucy,astudent:") i.SayHi() i.Sing("HappyBirthday") i.Guzzle("Hahaha...") //i存储Employee i=tom fmt.Println("Thisistom,anEmployee:") i.SayHi() //定义sliceMen,包含Men类型元素的切片,这个slice可以被赋予实现了Men接口的任意结构的对象 fmt.Println("Let'suseasliceofMenandseewhathappens:") x:=make([]Men,3) //三个不同类型(不同Method)的元素,实现了同一个interface(Men) x[0],x[1],x[2]=lucy,lily,liming for_,value:=rangex{ value.SayHi() } }
函数参数
interface接口还可以作为函数参数,因为interface的变量可以持有任意实现该interface类型的对象,我们可以通过定义interface参数,让函数接受各种类型的参数。判断interface变量存储的元素的类型,目前常用的有两种方法:Comma-ok断言和switch测试。
goversiongo1.12
/** *interface接口作为函数参数 *判断interface变量存储的元素的类型 */ packagemain import( "fmt" "strconv" ) //定义Human对象 typeHumanstruct{ namestring ageint phonestring } //定义空接口 typeElementinterface{} //定义切片 typeList[]Element //定义Person对象 typePersonstruct{ namestring ageint } //通过定义interface参数,让函数接受各种类型的参数 //通过这个Method(方法),Human对象实现了fmt.Stringer接口 //Stringer接口是fmt.Println()的参数,最终使得Human对象可以作为fmt.Println的参数被调用 func(hHuman)String()string{ return"<"+h.name+"-"+strconv.Itoa(h.age)+"years-phone:"+h.phone+">" } //通过定义interface参数,让函数接受各种类型的参数 //通过这个Method(方法),Person对象实现了fmt.Stringer接口 //Stringer接口是fmt.Println()的参数,最终使得Person对象可以作为fmt.Println的参数被调用 func(pPerson)String()string{ return"(name:"+p.name+"-age:"+strconv.Itoa(p.age)+"years)" } funcmain(){ //interface作为函数的参数传递 Lucy:=Human{"Lucy",29,"10086"} fmt.Println("Thishumanis:",Lucy) list:=make(List,3) list[0]=100 list[1]="HelloGolang!" list[2]=Person{"Lily",19} //Comma-ok断言 forindex,element:=rangelist{ //判断变量的类型格式:value,ok=element(T) //value是interface变量的值,ok是bool类型,element是interface的变量,T是断言的interface变量的类型 ifvalue,ok:=element.(int);ok{ fmt.Printf("list[%d]isanintandit'svalueis%d\n",index,value) }elseifvalue,ok:=element.(string);ok{ fmt.Printf("list[%d]isastringandit'svalueis%s\n",index,value) }elseifvalue,ok:=element.(Person);ok{ fmt.Printf("list[%d]isaPersonandit'svalueis%s\n",index,value) }else{ fmt.Printf("list[%d]isadifferenttype\n",index) } } //switch forindex,element:=rangelist{ //注意:element.(type)语法不能在switch外的任何逻辑中使用 switchvalue:=element.(type){ caseint: fmt.Printf("list[%d]isanint,it'svalueis%d\n",index,value) casestring: fmt.Printf("list[%d]isastring,it'svalueis%s\n",index,value) casePerson: fmt.Printf("list[%d]isaPerson,it'svalueis%s\n",index,value) default: fmt.Printf("list[%d]isadifferernttype",index) } } }
以上就是详解Golang语言中的interface的详细内容,更多关于Golang语言中的interface的资料请关注毛票票其它相关文章!