持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第37天,点击查看活动详情
一、方法介绍和使用
1.1 方法介绍
Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct
1.2 方法声明和调用
type A struct{
Num int
}
// A类型结构体有一个方法叫 test()
func(a A) test(){
fmt.Println(a.Num)
}
说明:
- 表示 A结构体有一个方法,方法名为 test
- (a A)体现test方法是和A类型绑定的
案例
package main
import "fmt"
type Person struct {
Name string
}
// 给A类型绑定一个方法
func (p Person) test() {
fmt.Println("test() name = ", p.Name)
}
func main() {
// 创建一个person实例
var p Person
//调用方法
// 得到 test() name = , name为空,。没有赋值
p.test()
// 赋值再调用
p.Name = "Aliy"
// test() name = Aliy
p.test()
}
- test方法和Person类型绑定
- test方法只能通过Person类型的变量/实例进行调用,不能指剑调用,也不能使用其他类型变量来调用
- func (p Person) test(){....} ====> p 表示哪个Person变量调用,这个p就是它的
副本,和函数传参类似,下面为例
package main
import "fmt"
type Person struct {
Name string
}
// 给A类型绑定一个方法
func (p Person) test() {
p.Name = "Bobbbbbb"
fmt.Println("test() name = ", p.Name)
}
func main() {
// 创建一个person实例
var p Person
// 赋值再调用
p.Name = "Aliy"
// test() name = Aliy
p.test()
// main() p.Name Aliy
fmt.Println("main() p.Name", p.Name)
}
- 形参中的p 是可以随意指定
二、方法快速入门
需求
- 给Person结构体添加一个speak方法,输出 xx 是一个好人
- 给Person结构体添加一个calc方法,计算1-1000相加的结果,说明方法体内可以像函数一样,进行各种运算
- 给Person结构体calcN方法,该方法可以接收一个数n,计算从1+..+n的结果
- 给Person结构体添加getSum方法,可以计算两个数的和,并返回结果
package main
import "fmt"
type Person struct {
Name string
}
// 给Person结构体添加一个speak方法
func (p Person) speak() {
fmt.Println(p.Name, "是一个好人")
}
// 给Person结构体添加一个calc方法,计算1-1000相加的结果
func (p Person) calc() {
res := 0
for i := 0; i <= 1000; i++ {
res += i
}
fmt.Println(p.Name, " 计算的结果 = ", res)
}
// 给Person结构体calcN方法,该方法可以接收一个数n,计算从1+..+n的结果
func (p Person) calcN(n int) {
res := 0
for i := 0; i <= n; i++ {
res += i
}
fmt.Printf("%v 计算到%v = %v\n", p.Name, n, res)
}
// 给Person结构体添加getSum方法,可以计算两个数的和,并返回结果
func (p Person) getSum(x int, y int) int {
return x + y
}
func main() {
//声明实例
p := Person{}
p.Name = "Aliy"
// Aliy 是一个好人
p.speak()
//Aliy 计算的结果 = 500500
p.calc()
// Aliy 计算到100 = 5050
p.calcN(100)
// getSum调用
// getSum调用计算5 + 15 = 20
fmt.Printf("getSum调用计算5 + 15 = %v", p.getSum(5, 15))
}
三、方法的调用和传参机制
说明:方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法
从章节二可以得到如下内容:
- 通过一个变量去调用方法时,其调用机制和函数一样
- 变量调用方法时,变量本身也会作为一个参数传递到方法(如果变量是值类型,就进行值拷贝;如果变量是引用类型,则进行地址拷贝)
案例 编写程序
- 声明一个结构体Circle.字段为 radius
- 声明一个方法area和Circle绑定,可以返回面积
package main
import "fmt"
// 1. 声明一个结构体Circle.字段为 radius
// 2. 声明一个方法area和Circle绑定,可以返回面积
type Circle struct {
radius float64
}
func (c Circle) area() float64 {
return 3.14 * c.radius * c.radius
}
func main() {
// 创建实例
c := Circle{}
c.radius = 3.14
// 3.14 的圆的面积是 30.959144000000002
fmt.Printf("%v 的圆的面积是 %v\n", c.radius, c.area())
}