GO語言基礎之method

2021-09-07 19:44:26 字數 2122 閱讀 7318

方法 method

1. go 中雖沒有 class,但依舊有 method

2. 通過顯示說明 receiver 來實現與某個型別的組合

3. 只能為同乙個包中的型別定義方法

4. receiver 可以是型別的值或者指標

5. 不存在方法過載

6. 可以使用值或指標來呼叫方法,編譯器會自動完成轉換

7. 從某種意義上來說,方法是函式的語法糖,因為 receiver 其實就是方法所接收的第1個引數(method value vs. method expression)

8. 如果外部結構和嵌入結構存在同名方法,則優先呼叫外部結構的方法

9. 型別別名不會擁有底層型別所附帶的方法

10. 方法可以呼叫結構中的非公開字段

package main

import "fmt"

type a struct

type b struct

//引用傳遞得道到是指標到拷貝,修改會同步修改結構體內到內容

func (a *a) print()

//值傳遞只是得到結構體內容到拷貝

func (b b) print()

func main()

a.print()

fmt.println(a.name)

b := b{}

b.print()

fmt.println(b.name)

}

執行結果:

1

2

3

4

a

aa

b

《空字串》

go 還有乙個特別靈活的地方,就是它可以為任何乙個宣告型別繫結定義乙個方法,如下:

package main

import "fmt"

/**go到乙個靈活到地方就是可以為type宣告到任何型別繫結乙個方法

例如下面到例子,定義了型別為整型到變數va,為其繫結乙個輸出函式並在主方法中呼叫

*/type va int

func (a *va) print()

func main()

執行結果:

va說明:這裡需要說明一點,結構體內部宣告的變數首字母大小寫是決定不同包之間的呼叫時公開的還是私有的,而在同乙個包下,即使是小寫的也是可以被呼叫到的。

以上說了這麼多,相信有很大一部分人覺得很亂,不一會函式不一會方法 method 的,感覺這兩者都一樣啊,那為什麼還這麼費勁的分開講呢?這塊對於初學者來說卻是很容易混淆,簡單的可以從以下兩方面考慮:

1.對於普通函式,接收者為值型別時,不能將指標型別的資料直接傳遞,反之亦然。

2.對於方法(如struct的方法),接收者為值型別時,可以直接用指標型別的變數呼叫方法,反過來同樣也可以。

說人話就是:方法(method)與物件相關,函式(func)與物件無關,其實區別不大.有時需要物件導向思想時用方法名嘍.method是繫結到了具體struct上了,而func就是簡單的乙個函式。

還有不理解的?收到有的同學的提問,我就只好再囉嗦一句更加人話的人話:

method是附屬在乙個給定的型別上的,他的語法和函式的宣告語法幾乎 一樣,只是在 func 後面增加了乙個receiver(也就是method所依從的主體)。非得讓我舉例子嗎,那好吧,我妥協了,看一下下面的例子吧:

// 定義了乙個矩形結構體

type rectangle struct

/*這裡就是函式即func,其宣告:

func funcname(parameters) (results)

*/func area(r rectangle) float64

/* 這裡就是方法即method,其宣告:

func (r receivertype) funcname(parameters) (results)

*/func (r rectangle) area() float64

Go語言基礎 method

我們在c語言中,struct中宣告函式,而go中則不能再struct中宣告函式。而是採用另外一種形態存在,go中叫method。method是附屬在乙個給定的型別上,語法和函式的宣告語法幾乎一樣,只是再func後面增加了乙個recevier 也就是method所依從的主體 func r receiv...

go語言學習筆記 方法 method

理解 go語言中的方法也是函式的一種,只不過在func和函式名之間增加了引數 型別接收器 接收器的型別可以是自定義的結構體或者非結構體型別,也可以是重定義的基本型別如int string或指標型別,支援在方法內部訪問該引數。語法 func param type methodname 下面我們用乙個例...

go語言基礎之range

在go語言中,遍歷資料或切片時可以用range,range會產生兩個值,分別是資料的索引與值 package main import fmt func main for v range x 這種寫法非常不好 雖然沒有報錯 因為for range的過程中,產生了index 索引 與value兩個值,但...