[TOC]
>[success] ## **1:基本介绍**
在某些情况下,我们要需要声明(定义)方法。比如Person结构体:除了有一些字段外( 年龄,姓名.),Person结构体还有一些行为比如:可以说话、跑步..通过学习,还可以做算术题。这时就要用方法才能完成。
Golang中的方法是**作用在指定的数据类型上** 的(即:和**指定的数据类型绑定**),因此**自定义类型,都可以有方法**,而不仅仅是struct
>[success] ## **2:方法声明和调用**
```
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类型绑定的
<br>
### **2.1:案例演示**
![](https://img.kancloud.cn/45/48/454816ee9236d161726db03c9375eac3_1047x720.png)
<br>
**上面代码总结**
1)test方法和Person类型绑定
2)test方法只能通过Person类型的变量来调用,而不能直接调用,也不能使用其他变量来调用
### **2.2:方法快速入门**
1)给Person结构体添加speak方法输出xxx是一个好人
![](https://img.kancloud.cn/38/e8/38e86094d36a6ea6f1186e03f8a652d7_1280x643.png)
<br>
2)给Person结构体添加sum方法,可以计算从1+..+1000的结果
![](https://img.kancloud.cn/0d/e3/0de3be8c71a4e93693f953f3cb6e575c_1095x720.png)
<br>
3)给Person结构体jisuan2方法,该方法可以接收一个数n,计算从1+....+n的结
![](https://img.kancloud.cn/70/d6/70d6ddc61def3c754d26bbd4ecb8d23c_1204x720.png)
<br>
4)给Person结构体添加getSum方法,可以计算两个数的和,并返回结果。
![](https://img.kancloud.cn/4c/ff/4cff9e870b139ec472911dfa25974787_1280x707.png)
>[success] ## **3:方法调用和传参机制**
**方法的调用和传参机制原理: (重要! )**
说明:方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法。下面我们举例说明:
**案例1:** 画出前面getsum方法的执行过程+说明
![](https://img.kancloud.cn/71/82/7182d3d27826eeb5a0d304df75769207_1280x534.png)
<br>
<br>
**说明:**
1)在通过一个变量去调用方式时,其调用机制和函数一样
2)不一样的地方时,变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类型,则进行值拷贝,如果变量是引用类型,则进行地址拷贝)
**案例2:** 请编写一个程序,要求如下:
1)声明一个结构体Circle,字段为radius
2)声明一个方法area和Circle绑定, 可以返回面积。
3)提示:画出area执行过程+说明
![](https://img.kancloud.cn/97/0b/970b8f05a49d7fa1ae440968406b6ddd_1032x720.png)
>[success] ## **4:方法的定义**
### **4.1:理解1:**
![](https://img.kancloud.cn/27/42/27423f933b1db3a91cc8951f1fd1a33a_1280x222.png)
1)参数列表:表示方法输入
2)recevier type :表示这个方法和type这个类型进行绑定,或者说该方法作用于type类型
3)receiver type : type可以是结构体,也可以其它的自定义类型
4)receiver :就是type类型的一个变量(实例),比如: Person结构体 的一个变量(实例
5)参数列表:表示方法输入
6)返回值列表:表示返回的值,可以多个
7)方法主体:表示为了实现某一功能代码块
8)return 语句不是必须的。
<br>
<br>
### **4.2:理解2**
![](https://img.kancloud.cn/e7/ad/e7adc3a57112fab81b3b346ec9ea38d3_1280x143.png)
1. 接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为 p,Connector类型的接收者变量应该命名为c等。
2. 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
3. 方法名、参数列表、返回参数:具体格式与函数定义相同。
### **4.3:方法的注意事项**
1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式
2)如程序员希望在方法中,修改结构体变量的值,可以通过结构体指针的方式来处理
3)Golang中 的方法作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是struct,比如int , float32等都可以有方法
![](https://img.kancloud.cn/57/59/57592f1295cbf05bf425158e9a93a461_1280x550.png)
4)**方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。[讲解]**
5)如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出
![](https://img.kancloud.cn/11/dc/11dc070ae176d6f846890e4266ca5bd7_1280x609.png)
<br>
<br>
### **4.4:方法和接收者**
![](https://img.kancloud.cn/40/dd/40dda3629aeec69ca93bf465f5a53125_1280x657.png)
<br>
<br>
**案例如下:**
![](https://img.kancloud.cn/b4/0b/b40b4c86a4152c6593e9cb4dd5c57b3a_948x720.png)
<br>
<br>
### **4.5:方法的练习**
1)编写结构体(MethodUtils),编程一个方法, 方法不需要参数,在方法中打印一个10\*8的矩形,在main方 法中调用该方法
![](https://img.kancloud.cn/75/e3/75e3c688d16658c2fa12f2bf03e8afc6_895x720.png)
<br>
2)编写一个方法,提供m和n两个参数,方法中打印一个m\*n的矩形
![](https://img.kancloud.cn/16/dc/16dc16b3bb49665fbf34fab52bd2b858_1233x720.png)
<br>
3)编写一个方法算该矩形的面积(可以接收长len,和宽width), 将其作为方法返回值。在main方法中调用该方法,接收返回的面积值并打印
![](https://img.kancloud.cn/c4/a7/c4a77e1db707715cf184c13e8ec02217_1280x452.png)
<br>
4)编写一个方法,判断一个数是奇数还是偶数
![](https://img.kancloud.cn/0c/3a/0c3a3a5f0c0a585a4b9b0071d3924507_1280x586.png)
<br>
5)编写一个方法,传入的参数可以进行计算
![](https://img.kancloud.cn/0d/58/0d58851849d379372fb77a354c9d69c2_828x720.png)
<br>
### **4.6:方法和函数的区别**
1)调用方式不一样
函数的调用方式:函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)
2)对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然
![](https://img.kancloud.cn/44/34/44346bc0353a6451bcd931d5fd7dbc0e_1280x625.png)
<br>
3)对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以
![](https://img.kancloud.cn/33/d1/33d18b7df6773d7caf0bc093595c1f78_1209x720.png)
<br>
### **4.7:总结**
1)不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法是和哪个类型绑定
2)如果是和值类型,比如(p Person).则是值拷贝,如果和指针类型,比如是(p \*Person)则是地址拷贝。
- Golang语言之旅
- 第一章:初始小节以及安装
- 一:Golang语言特性
- 二:Windows上安装Go语言开发包
- 三:在Mac OS上安装Go语言开发包
- 第二章:GO语言注意事项
- 一:Dos的常用指令
- 第三章:Go初识小菜
- 一:Go语言之变量与常量
- 二:Go内置值-引用类型
- 三:基本的数据类型
- 四:字符串(char)
- 五:布尔类型(bool)
- 六:字符串类型(string)
- 七:基本数据类型的默认值
- 八:基本数据类型的互相转换
- 九:基本数据类型和string类型的相互转换
- 十:Golang指针
- 十一:值类型和引用类型
- 十二:标识符和命名规范
- 十三:系统保留关键字and预定义标识符
- 十四:fmt常用方法解析
- 第四章:Go运算符
- 一:运算符的基本介绍
- 二:算术运算符
- 2.1:算数运算符细节
- 三:关系运算符
- 3.1:关系运算符细节
- 四:逻辑运算符
- 4.1:逻辑运算符细节及案例
- 五:Go赋值运算符
- 5.1:案例演示赋值运算符的基本使用
- 5.2:赋值运算符的特点
- 六:Go位运算符
- 七:其他运算符
- 八:运算符的优先级
- 九:控制台输入语句
- 十:进制
- 十一:位运算
- 第五章:流程控制大纲
- 一:if语句
- 二:switch语句
- 三:for循环
- 第六章:函数-包-错误处理
- 一:Go函数
- 二:Go包
- 三:匿名函数
- 四:闭包
- 五:函数defer
- 六:函数参数的传递方式
- 七:变量的作用域
- 八:时间和日期相关函数
- 九:new和recover异常
- 十:数组(Array)切片(Section)
- 十一:切片(slice)
- 十二:3 数组的排序和查找
- 第七章:Map
- 第一节:Map基础认识
- 第二节:Map初始化和make
- 第三节:Map增删改查
- 第四节:Map的切片
- 第五节:Map的注意事项
- 第八章:面向对象(上)
- 第一节:结构体(值类型)
- 第二节:方法
- 第三节:面向对象编程应用实例
- 第九章:面向对象(下)
- 第一节:面向对象之抽象
- 第二节:面向对象之继承
- 第三节:面向对象之多态
- 第四节:接口
- 第十章:文件操作
- 第一节:文件基本介绍
- 第二季:写文件实例操作
- 第三节:JSON
- 第十一章:单元测试
- 第一节:单元测试介绍
- 第二节:单元测试案例
- 第三节:单元测试总结
- 第四节:单元测试案例
- 第十二章:goroutine和channel
- 第一节:goroutine基本介绍
- 第二节:goroutine入门案例
- 第三节:goroutione调度模型
- 第四节:Golang设置运行的CPU数量
- 第十二章:channel
- 第一节:channel基本介绍
- 第二节:channel基本使用
- 第三节:channel案例演示
- 第四节:channel 使用的注意事项
- 第五节:channel练习题
- 第六节:channel的遍历和关闭
- 第七节:goroutione和channel结合
- 第八节:channel细节处理
- 第十二章:并发模式
- 第十三章:反射reflect
- 第一节:反射基本介绍
- 第二节:反射重要的函数和概念
- 第三节:反射快速入门案例
- 第四节:反射注意事项
- 第五节:反射练习题
- 第六节:反射最佳实践