方法其实就是一个函数,在 func
这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。
func (t Type) methodName(parameter list) {
}
1.方法绑定给结构体 //1.定义结构体 type Person struct { name string age int sex int } //2.给Person结构体加一个打印名字的方法 func (a Person)printName() { fmt.Println(a.name) //接收器直接使用结构体内属性 } //3.main函数中使用 var p *Person=&Person{name:"lqz"} //实例化 p.printName() //调用方法
1.值接收器和指针接收器的区别在于方法接收器的类型; func (a Person)changeName(name string) //值接收器 unc (a *Person)changeName(name string) //指针接收器
2.
//func (值)changeName(name string):在内部修改值,不会影响外部的值
//func (指针)changeName(name string):在内部修改值,会影响外部的值
示例:
1.值接收器方法 //1.定义结构体 type Person struct { name string age int sex int } //2.绑定方法 func (a Person)changeName(name string) { a.name=name fmt.Println(a) //{egon 0 0} } //3.main函数调用 p.changeName("egon") fmt.Println(p) //{lqz 0 0} 2.指针接收器方法 //1.定义结构体 type Person struct { name string age int sex int } //2.绑定方法 func (a *Person)changeName(name string) { a.name=name fmt.Println(a) //&{egon 0 0} } //3.main函数调用 //var p *Person=&Person{name:"lqz"} //这种也可以,go给你处理了 var p Person=Person{name:"lqz"} p.changeName("egon") fmt.Println(p)//{egon 0 0}
前提:属于结构体的匿名字段的方法可以被直接调用,就好像这些方法是属于定义了匿名字段的结构体一样。匿名才会提升不匿名不会提升。如果子类有就用自己的,没有用父类的
1.定义 type Person1 struct { name string age int sex int Hobby } type Hobby struct { id int hobbyname string } 2.绑定方法 func (h Hobby)printHobbyId() { fmt.Println(h.id) } func (a Person1)printName() { fmt.Println(a.name) } func (a Person1)printHobbyId() { fmt.Println("我重写了") //重用父类的方法 //a.Hobby.printHobbyId() fmt.Println(a.Hobby.id) } 3.main函数中 //p:=Person1{name:"lqz",Hobby:Hobby{id:10}} // ////正常操作 ////p.Hobby.printHobbyId() ////非正常操作 方法也提升了 //p.printHobbyId()
type Person2 struct { name string age int sex int } //方法中使用值接收器 func (a Person2)printName() { fmt.Println(a.name) } //方法中使用指针接收器 func (a *Person2)printName2() { fmt.Println(a.name) } //函数中使用值参数 func printName(a Person2) { fmt.Println(a.name) } //在函数中使用指针参数 func printName2(a *Person2) { fmt.Println(a.name) } func main() { //p:=&Person2{name:"lqz"} //调用值接收器 //p.printName() //调用指针接收器 //p.printName2() //调用值函数 //printName(p) //调用指针函数 //printName2(&p) //不管是指针接收器还是值接收器,都可以使用值来调用 //不管是指针接收器还是值接收器,都可以使用指针来调用 //函数中,是什么参数,就得传什么参数
接口是一系列方法的集合。
1.
type 接口名 interface{
方法一
方法二
}
原文:https://www.cnblogs.com/tfzz/p/12032329.html