详解golang中的method
什么是method(方法)?method是函数的另外一种形态,隶属于某个类型的方法。
method的语法:
func(rReceiver)funcName(parameters)(result)
receiver可以看作是method的第一个参数,method并且支持继承和重写。
- Go中虽没有class,但依旧有method
- 通过显示说明receiver来实现与某个类型的结合
- 只能为同一个包中的类型定义方法
- receiver可以是类型的值或者指针
- 不存在方法重载
- 可以使用值或指针来调用方法,编译器会自动完成转换
- 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(MethodValuevs.MethodExpression)
- 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
- 类型别名不会拥有底层类型所附带的方法
- 方法可以调用结构中的非公开字段
goversiongo1.12
/**
*什么是method(方法)?method是函数的另外一种形态,隶属于某个类型的方法。
*method的语法:func(rReceiver)funcName(parameters)(result)。
*receiver可以看作是method的第一个参数,method并且支持继承和重写。
*/
packagemain
import(
"fmt"
)
typeHumanstruct{
namestring
ageint
}
//字段继承
typeStudentstruct{
Human//匿名字段
schoolstring
}
typeEmployeestruct{
Human//匿名字段
companystring
}
//函数的另外一种形态:method,语法:func(rReceiver)funcName(parameters)(result)
//method当作struct的字段使用
//receiver可以看作是method的第一个参数
//指针作为receiver(接收者)和普通类型作为receiver(接收者)的区别是指针会对实例对象的内容发生操作,
//普通类型只是对副本进行操作
//method也可以继承,下面是一个匿名字段实现的method,包含这个匿名字段的struct也能调用这个method
func(h*Human)Info(){
//method里面可以访问receiver(接收者)的字段
fmt.Printf("Iam%s,%dyearsold\n",h.name,h.age)
}
//method重写,重写匿名字段的method
//虽然method的名字一样,但是receiver(接收者)不一样,那么method就不一样
func(s*Student)Info(){
fmt.Printf("Iam%s,%dyearsold,Iamastudentat%s\n",s.name,s.age,s.school)
}
func(e*Employee)Info(){
fmt.Printf("Iam%s,%dyearsold,Iamaemployeeat%s\n",e.name,e.age,e.company)
}
funcmain(){
s1:=Student{Human{"Jack",20},"tsinghua"}
e1:=Employee{Human{"Lucy",26},"Google"}
//调用method通过.访问,就像struct访问字段一样
s1.Info()
e1.Info()
}
以上就是详解golang中的method的详细内容,更多关于golang中的method的资料请关注毛票票其它相关文章!