GO语言基础之method
方法 method
1. Go 中雖沒有 class,但依舊有 method
2. 通過顯示說明 receiver 來實現與某個類型的組合
3. 只能為同一個包中的類型定義方法
4. Receiver 可以是類型的值或者指針
5. 不存在方法重載
6. 可以使用值或指針來調用方法,編譯器會自動完成轉換
7. 從某種意義上來說,方法是函數的語法糖,因為 receiver 其實就是方法所接收的第1個參數(Method Value vs. Method Expression)
8. 如果外部結構和嵌入結構存在同名方法,則優先調用外部結構的方法
9. 類型別名不會擁有底層類型所附帶的方法
10. 方法可以調用結構中的非公開字段
package mainimport "fmt"type A struct {Name string }type B struct {Name string }//引用傳遞得道到是指針到拷貝,修改會同步修改結構體內到內容 func (a *A) Print() {a.Name = "AA"fmt.Println("A") }//值傳遞只是得到結構體內容到拷貝 func (b B) Print() {b.Name = "BB"fmt.Println("B") }func main() {a := A{}a.Print()fmt.Println(a.Name)b := B{}b.Print()fmt.Println(b.Name) }運行結果:
| 1 2 3 4 | A AA B <空字符串> |
?Go 還有一個特別靈活的地方,就是它可以為任何一個聲明類型綁定定義一個方法,如下:
package mainimport "fmt"/** Go到一個靈活到地方就是可以為type聲明到任何類型綁定一個方法 例如下面到例子,定義了類型為整型到變量Va,為其綁定一個輸出函數并在主方法中調用*/ type Va intfunc (a *Va) Print() {fmt.Println("Va") }func main() {var a Vaa.Print() }運行結果:
Va
說明:這里需要說明一點,結構體內部聲明的變量首字母大小寫是決定不同包之間的調用時公開的還是私有的,而在同一個包下,即使是小寫的也是可以被調用到的。
以上說了這么多,相信有很大一部分人覺得很亂,不一會函數不一會方法 method 的,感覺這兩者都一樣啊,那為什么還這么費勁的分開講呢?這塊對于初學者來說卻是很容易混淆,簡單的可以從以下兩方面考慮:
1.對于普通函數,接收者為值類型時,不能將指針類型的數據直接傳遞,反之亦然。
2.對于方法(如struct的方法),接收者為值類型時,可以直接用指針類型的變量調用方法,反過來同樣也可以。
說人話就是:方法(method)與對象相關,函數(func)與對象無關,其實區別不大.有時需要面向對象思想時用方法名嘍.method是綁定到了具體struct上了,而func就是簡單的一個函數。
還有不理解的?收到有的同學的提問,我就只好再啰嗦一句更加人話的人話:
method是附屬在一個給定的類型上的,他的語法和函數的聲明語法幾乎 一樣,只是在 func 后面增加了一個receiver(也就是method所依從的主體)。非得讓我舉例子嗎,那好吧,我妥協了,看一下下面的例子吧:
// 定義了一個矩形結構體 type Rectangle struct {width, height float64 }/*這里就是函數即func,其聲明:func funcName(parameters) (results) */ func area(r Rectangle) float64 {return r.width*r.height }/*
這里就是方法即method,其聲明:func (r ReceiverType) funcName(parameters) (results) */ func (r Rectangle) area() float64 {return r.width*r.height }
?
總結
以上是生活随笔為你收集整理的GO语言基础之method的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 983大学(说一说983大学的简介)
- 下一篇: 光绪皇帝(说一说光绪皇帝的简介)