面向对象之方法1
基本介绍:
在某些情况下,我们要需要声明(定义)方法。比如Person 结构体:除了有一些字段外(年龄,姓名...),Person结构体还有一些行为比如:可以说话、跑步...,通过学习,还可以做算术题。这时就要用方法才能完成。
Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct
方法的声明和调用:
type A struct {
Num int
}
func (a A) test() {
fmt.Println(a.Num)
}
对上面的语法的说明:
1)func (a A) test() {} 表示 A结构体有一个方法,方法名为test
2)(a A) 体现 test 方法是和 A类型绑定的
举例说明:
type Person struct {
Name string
}
//给Person类型绑定一个方法
func (p Person) test() {
fmt.Println("test() name=", p.Name)
}
type Dog struct {
}
func main() {
var p Person
p.Name = "tom"
p.test() //调用方法
//下面的使用方式都是错误的
var dog Dog
dog.test()
test()
}
对上面的代码做说明:
1)test 方法和 Person 类型绑定
2)test 方法只能通过 Person 类型的变量来调用,而不能直接调用,也不能使用其他类型的变量来调用。
3)func (p Person) test() {}... p 表示那个 Person 变量调用,这个p 就是它的副本。和函数传参非常相似。
4)p 这个名字,由程序员指定,不是固定的。比如修改成 person 也可以。
type Person struct {
Name string
}
//给Person类型绑定一个方法
func (p Person) test() {
p.Name = "jack"
fmt.Println("test() name=", p.Name) //输出jack
}
func main() {
var p Person
p.Name = "tom"
p.test() //调用方法
fmt.Println("main() p.Name=", p.Name) //输出tom
}
快速入门:
1)给Person结构体添加speak 方法,输出 xxx是一个好人
案例:
type Person struct {
Name string
}
func (p Person) speak() {
fmt.Println(p.Name, "是一个goodman")
}
func main() {
var p Person
p.Name = "tom"
p.speak()
}
2)给Person结构体添加jisuan 方法,可以计算从 1+..+1000的结果
案例:
type Person struct {
Name string
}
func (p Person) jisuan() {
res := 0
for i := 1; i <= 1000; i++ {
res += i
}
fmt.Println(p.Name, "计算的结果是=", res)
}
func main() {
var p Person
p.Name = "tom"
p.jisuan()
}
3)给Person结构体添加jisuan2方法,该方法可以接收一个数n,计算从1+..+n的结果
案例:
type Person struct {
Name string
}
func (p Person) jisuan2(n int) {
res := 0
for i := 1; i <= n; i++ {
res += i
}
fmt.Println(p.Name, "计算的结果是=", res)
}
func main() {
var p Person
p.Name = "tom"
p.jisuan2(20)
}
4)给Person结构体添加getSum方法,可以计算两个数的和,并返回结果。
案例:
type Person struct {
Name string
}
func (p Person) getSum(n1 int, n2 int) int {
return n1 + n2
}
func main() {
var p Person
p.Name = "tom"
res := p.getSum(10, 20)
fmt.Println("res=", res)
}
5)方法的调用
p.speak()
p.jisuan()
p.jisuan2(20)
res := p.getSum(10,20)
fmt.Println("res=", res)