方法
- 基本介绍
- 在某些情况下,我们要需要声明(定义)方法。比如 Person 结构体:除了有一些字段外( 年龄,姓名..),Person 结构体还有一些行为比如:可以说话、跑步..,通过学习,还可以做算术题。这时就要用方法才能完成。
- Golang 中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是 struct。
- 方法的声明和调用
type A struct { Num int } func (a A) test() { fmt.Println(a.Num) }
- 对上面的语法的说明
- func (a A) test() {} 表示 A 结构体有一方法,方法名为 test
- (a A) 体现 test 方法是和 A 类型绑定的
type Person struct{ Name string } //给Person类型绑定一方法 func (person Person) test() { fmt.Println("test() name=", person.Name) } func main() { var p Person p.Name = "tom" p.test() //调用方法 }
- 输出结果:
- 对上面的总结
- test 方法和 Person 类型绑定
- test 方法只能通过 Person 类型的变量来调用,而不能直接调用,也不能使用其它类型变量来调用
- func (p Person) test() {}... p 表示哪个 Person 变量调用,这个 p 就是它的副本, 这点和函数传参非常相似。
type Person struct{ Name string } //给Person类型绑定一方法 func (person Person) test() { person.Name = "jack" fmt.Println("test() name=", person.Name) } func main() { var p Person p.Name = "tom" p.test() //调用方法 fmt.Println("main() p.Name=", p.Name) }
- 输出结果:
- p 这个名字,有程序员指定,不是固定, 比如修改成 person 也是可以
方法的使用
- 给 Person 结构体添加 speak 方法,输出 xxx 是一个好人
type Person struct{ Name string } //给Person结构体添加speak 方法,输出 xxx是一个好人 func (p Person) speak() { fmt.Println(p.Name, "是一个goodman~") } func main() { var p Person p.Name = "卤蛋" p.speak() }
- 输出结果:
- 给 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 = "卤蛋" p.jisuan() }
- 输出结果:
- 给 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 = "卤蛋" p.jisuan2(18) }
- 输出结果:
- 给 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 = "卤蛋" n1 := 10 n2 := 20 res := p.getSum(n1, n2) fmt.Println("res=", res) }
- 输出结果:
来源:oschina
链接:https://my.oschina.net/u/4350320/blog/4335035