本章主要学习 方法 的概念
1.方法概念
理解:方法相当于cpp的类的成员函数
但是这个成员函数是和某个类型绑定了。
a相当于是一个形参,代表调用对象,这里是一个值传递,内部修改不会影响外部
package main
import "fmt"
type Person struct {
Name string
}
// Person绑定方法test
func (p Person) test() {
fmt.Println("test函数", p.Name)
}
func main() {
var p,q Person
p.Name = "PPP"
q.Name = "QQQ"
p.test()
q.test()
}
结果:
tips:
2.向函数传指针类型可以影响外部对象
1)传值
package main
import "fmt"
type Person struct {
Name string
}
// Person绑定方法test
func (p Person) test() {
fmt.Println("test函数", p.Name)
}
func (p Person) test2() {
p.Name = "AAA"
fmt.Println("test2函数", p.Name)
}
func main() {
var p, q Person
p.Name = "PPP"
q.Name = "QQQ"
p.test()
q.test()
//传值
p.test2()
fmt.Println("test2函数调用后", p.Name)
}
2)传指针
package main
import "fmt"
//函数传指针改外部变量
type Person struct {
Name string
}
// Person绑定方法test
func (p *Person) test() {
fmt.Println("test函数", p.Name)
}
func (p *Person) test2() {
p.Name = "AAA"
fmt.Println("test2函数", p.Name)
}
func main() {
var p, q Person
p.Name = "PPP"
q.Name = "QQQ"
(&p).test()
(&q).test()
//传指针可以达到修改效果
(&p).test2()
fmt.Println("test2函数调用后", p.Name)
}
可以看出外部的p属性Name被test2()修改了
3)go编译器优化
3.其他自定义类型也可以绑定方法,不止struct
4.包访问权限和类的String()方法
package main
import "fmt"
//String()方法,在print这个类型的时候自动调用
type Student struct {
Name string
Age int
}
func (s *Student) String() string {
str := fmt.Sprintf("Name = %v, Age =%v", s.Name, s.Age)
return str
}
func main() {
var s *Student = &Student{ "SSS",36 }
fmt.Println(s)
}
5.函数和方法的一些区别