💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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)则是地址拷贝。