详解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的资料请关注毛票票其它相关文章!