[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:案例演示**

<br>
**上面代碼總結**
1)test方法和Person類型綁定
2)test方法只能通過Person類型的變量來調用,而不能直接調用,也不能使用其他變量來調用
### **2.2:方法快速入門**
1)給Person結構體添加speak方法輸出xxx是一個好人

<br>
2)給Person結構體添加sum方法,可以計算從1+..+1000的結果

<br>
3)給Person結構體jisuan2方法,該方法可以接收一個數n,計算從1+....+n的結

<br>
4)給Person結構體添加getSum方法,可以計算兩個數的和,并返回結果。

>[success] ## **3:方法調用和傳參機制**
**方法的調用和傳參機制原理: (重要! )**
說明:方法的調用和傳參機制和函數基本一樣,不一樣的地方是方法調用時,會將調用方法的變量,當做實參也傳遞給方法。下面我們舉例說明:
**案例1:** 畫出前面getsum方法的執行過程+說明

<br>
<br>
**說明:**
1)在通過一個變量去調用方式時,其調用機制和函數一樣
2)不一樣的地方時,變量調用方法時,該變量本身也會作為一個參數傳遞到方法(如果變量是值類型,則進行值拷貝,如果變量是引用類型,則進行地址拷貝)
**案例2:** 請編寫一個程序,要求如下:
1)聲明一個結構體Circle,字段為radius
2)聲明一個方法area和Circle綁定, 可以返回面積。
3)提示:畫出area執行過程+說明

>[success] ## **4:方法的定義**
### **4.1:理解1:**

1)參數列表:表示方法輸入
2)recevier type :表示這個方法和type這個類型進行綁定,或者說該方法作用于type類型
3)receiver type : type可以是結構體,也可以其它的自定義類型
4)receiver :就是type類型的一個變量(實例),比如: Person結構體 的一個變量(實例
5)參數列表:表示方法輸入
6)返回值列表:表示返回的值,可以多個
7)方法主體:表示為了實現某一功能代碼塊
8)return 語句不是必須的。
<br>
<br>
### **4.2:理解2**

1. 接收者變量:接收者中的參數變量名在命名時,官方建議使用接收者類型名稱首字母的小寫,而不是self、this之類的命名。例如,Person類型的接收者變量應該命名為?p,Connector類型的接收者變量應該命名為c等。
2. 接收者類型:接收者類型和參數類似,可以是指針類型和非指針類型。
3. 方法名、參數列表、返回參數:具體格式與函數定義相同。
### **4.3:方法的注意事項**
1)結構體類型是值類型,在方法調用中,遵守值類型的傳遞機制,是值拷貝傳遞方式
2)如程序員希望在方法中,修改結構體變量的值,可以通過結構體指針的方式來處理
3)Golang中 的方法作用在指定的數據類型上的(即:和指定的數據類型綁定),因此自定義類型,都可以有方法,而不僅僅是struct,比如int , float32等都可以有方法

4)**方法的訪問范圍控制的規則,和函數一樣。方法名首字母小寫,只能在本包訪問,方法首字母大寫,可以在本包和其它包訪問。[講解]**
5)如果一個變量實現了String()這個方法,那么fmt.Println默認會調用這個變量的String()進行輸出

<br>
<br>
### **4.4:方法和接收者**

<br>
<br>
**案例如下:**

<br>
<br>
### **4.5:方法的練習**
1)編寫結構體(MethodUtils),編程一個方法, 方法不需要參數,在方法中打印一個10\*8的矩形,在main方 法中調用該方法

<br>
2)編寫一個方法,提供m和n兩個參數,方法中打印一個m\*n的矩形

<br>
3)編寫一個方法算該矩形的面積(可以接收長len,和寬width), 將其作為方法返回值。在main方法中調用該方法,接收返回的面積值并打印

<br>
4)編寫一個方法,判斷一個數是奇數還是偶數

<br>
5)編寫一個方法,傳入的參數可以進行計算

<br>
### **4.6:方法和函數的區別**
1)調用方式不一樣
函數的調用方式:函數名(實參列表)
方法的調用方式:變量.方法名(實參列表)
2)對于普通函數,接收者為值類型時,不能將指針類型的數據直接傳遞,反之亦然

<br>
3)對于方法(如struct的方法),接收者為值類型時,可以直接用指針類型的變量調用方法,反過來同樣也可以

<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
- 第一節:反射基本介紹
- 第二節:反射重要的函數和概念
- 第三節:反射快速入門案例
- 第四節:反射注意事項
- 第五節:反射練習題
- 第六節:反射最佳實踐