【一Go到底】第三十七天---方法入门

143 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第37天,点击查看活动详情

一、方法介绍和使用

1.1 方法介绍

Golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct

1.2 方法声明和调用

type A struct{
    Num int
}

// A类型结构体有一个方法叫 test()
func(a A) test(){
    fmt.Println(a.Num)
}

说明:

  1. 表示 A结构体有一个方法,方法名为 test
  2. (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()
}
  1. test方法和Person类型绑定
  2. test方法只能通过Person类型的变量/实例进行调用,不能指剑调用,也不能使用其他类型变量来调用
  3. 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)
}

  1. 形参中的p 是可以随意指定

二、方法快速入门

需求

  1. 给Person结构体添加一个speak方法,输出 xx 是一个好人
  2. 给Person结构体添加一个calc方法,计算1-1000相加的结果,说明方法体内可以像函数一样,进行各种运算
  3. 给Person结构体calcN方法,该方法可以接收一个数n,计算从1+..+n的结果
  4. 给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))
}


三、方法的调用和传参机制

说明:方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法

从章节二可以得到如下内容:

  1. 通过一个变量去调用方法时,其调用机制和函数一样
  2. 变量调用方法时,变量本身也会作为一个参数传递到方法(如果变量是值类型,就进行值拷贝;如果变量是引用类型,则进行地址拷贝)

案例 编写程序

  1. 声明一个结构体Circle.字段为 radius
  2. 声明一个方法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())
}