页面加载中,请稍候
来源:嵌入式应用研究院发布时间:2023-05-241839浏览
询问 AI点击上方“嵌入式应用研究院”,选择“置顶/星标公众号”
干货福利,第一时间送达!来源 | golang编程笔记
整理&排版| 嵌入式应用研究院
1、go方法与类成员函数方法其实就是一个函数,在func这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。格式定义如下:
func(tType)methodName(parameterlist){
}
因为Go中没有类class的概念,所以要给自定义的类型添加成员函数就无法像C++一样写在类定义中,在Go中只能使用方法这一特性变相的实现成员函数和多态:
//定义类型
typeEmployeestruct{
namestring
ageint
}
//添加值接收器的方法
func(eEmployee)changeName(newNamestring){
e.name=newName
}
//添加指针接收器的方法
func(e*Employee)changeAge(newAgeint){
e.age=newAge
}
funcmain(){
e:=Employee{
name:"MarkAndrew",
age:50,
}
fmt.Printf("Employeenamebeforechange:%s",e.name)//调用属性
e.changeName("MichaelAndrew")//调用值接收器,无法改变属性值
fmt.Printf("\nEmployeenameafterchange:%s",e.name)
fmt.Printf("\n\nEmployeeagebeforechange:%d",e.age)
(&e).changeAge(51)//调用指针接收器
fmt.Printf("\nEmployeeageafterchange:%d",e.age)
}
注意:为了在一个类型上定义一个方法,方法的接收器类型定义和方法的定义应该在同一个包中,其实就是_类定义和成员函数定义要放在一起,很好理解_。
2、接口在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么(抽象定义),至于如何实现这个行为,则由对象本身去确定(实现细节)。
2.1、接口的定义在Go语言中,接口就是方法签名(Method Signature)的集合。当一个类型实现了接口中的所有方法,我们称它实现了该接口,这与面向对象编程(OOP)的说法很类似。我们可以用接口来实现C++面向对象的多态。
//interfacedefinition
typeinterfaceNameinterface{
methodName(parameterlist)
//...
}
使用示例如下:
//定义interface
typeDescriberinterface{
Describe()
}
//定义类型,可以当作C++类
typePersonstruct{
namestring
ageint
}
typeAddressstruct{
statestring
countrystring
}
//使用值接收器实现接口
func(pPerson)Describe(){
fmt.Printf("%sis%dyearsold\n",p.name,p.age)
}
//使用指针接收器实现接口
func(a*Address)Describe(){//使用指针接受者实现
fmt.Printf("State%sCountry%s",a.state,a.country)
}
funcmain(){
vard1Describer//定义接口类型变量,类似C++基类
p1:=Person{"Sam",25}
d1=p1//赋值为Person类型的对象,因为该对象已经实现接口,类似C++父类指针赋值子类对象
d1.Describe()//调用成员函数
vard2Describer
a:=Address{"Washington","USA"}
/*如果下面一行取消注释会导致编译错误:
cannotusea(typeAddress)astypeDescriber
inassignment:Addressdoesnotimplement
Describer(Describemethodhaspointer
receiver)
*/
//d2=a
d2=&a//这是合法的,因为Address类型的指针实现了Describer接口
d2.Describe()
}
我们可以把接口看作内部的一个元组 (type, value)
Go 语言没有提供继承机制,但可以通过嵌套其他的接口,创建一个新接口:
typeSalaryCalculatorinterface{
DisplaySalary()
}
typeLeaveCalculatorinterface{
CalculateLeavesLeft()int
}
//嵌套两个interface,类似C++继承两个基类
typeEmployeeOperationsinterface{
SalaryCalculator
LeaveCalculator
//可以再加新的方法接收器
}
typeEmployeestruct{
firstNamestring
lastNamestring
basicPayint
pfint
totalLeavesint
leavesTakenint
}
//实现接口方法
func(eEmployee)DisplaySalary(){
fmt.Printf("%s%shassalary$%d",e.firstName,e.lastName,(e.basicPay+e.pf))
}
func(eEmployee)CalculateLeavesLeft()int{
returne.totalLeaves-e.leavesTaken
}
新闻来源:嵌入式应用研究院,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-07-02

2026-06-15