Go 中的方法

2021-09-25 02:42:13 字數 2473 閱讀 1348

方法的宣告和普通函式的宣告類似,只是在函式名字前面多了乙個引數。這個引數把這個方法繫結到這個引數對應的型別上。

命名型別(point) 與指向它們的指標(*point)是唯一可以出現在接收者宣告處的型別。而且,為防止混淆,不允許本身是指標的型別進行方法宣告:

type p *

intfunc

(p)f()

// 編譯錯誤:非法的接收者型別

實際上編譯器會對變數進行 &p 的隱式轉換。只有變數才允許這麼做,包括結構體欄位,像 p.x 和陣列或者 slice 的元素,比如 perim[0] 。不能夠對乙個不能取位址的 point 接收者引數呼叫 *point 方法,因為無法獲取臨時變數的位址。

實參接收者和形參接收者是同乙個型別,比如都是 t 型別或都是 *t 型別。

或者實參接收者是 t 型別的變數而形參接收者是 *t 型別。編譯器會隱式地獲取變數的位址。

或者實參接收者是 *t 型別而形參接收者是 t 型別。編譯器會隱式地獲取實際的取值。

在資料流分析領域,集合元素都是小的非負整型,集合擁有許多元素,而且集合的操作多數是求並集和交集,位向量是個理想的資料結構。

位向量使用乙個無符號整型值的 slice,每一位代表集合中的乙個元素。如果設定第 i 位的元素,則認為集合包含 i 。

package main

import

("bytes"

"fmt"

)// intset 是乙個包含非負整數的集合

// 零值代表空的集合

type intset struct

// has 方法的返回值表示是否存在非負整數x

func

(s *intset)

has(x int

)bool

// add 新增非負整數 x 到集合中

func

(s *intset)

add(x int

) s.words[word]|=1

<< bit

}// unionwith 將會對s和t 做並集並將結果存在 s 中

func

(s *intset)

unionwith

(t *intset)

else}}

// string 方法以字串 "" 的形式返回集中

func

(s *intset)

string()

string

for j :=

0; j <

64; j++

fmt.

fprintf

(&buf,

"%d",64

* i + j)}}

} buf.

writebyte

('}'

)return buf.

string()

}

在intset 集合中,由於每乙個字擁有 64 位,因此為了定位 x 的位置,我們使用商數 x/64 作為字的索引,而 x % 64 記做該字內的索引。unionwith 操作使用按位 「或」 操作符 | 來計算一次64個元素求並集的結果。

var x, y intset

x.add(1

) x.

add(

144)

x.add(9

) fmt.

println

(x.string()

)// ""

y.add(9

) y.

add(42)

fmt.

println

(y.string()

)// ""

x.unionwith

(&y)

fmt.

println

(x.string()

)// ""

fmt.

println

(x.has(9

), x.

has(

123)

)// "true false"

fmt.

println

(&x)

// ""

fmt.

println

(x.string()

)// ""

fmt.

println

(x)// ""

fmt 在輸出 &x 的時候,輸出了 *intset 指標,它有乙個 string 方法。fmt 在輸出 x.string 的時候,編譯器會幫我們隱式地插入 &操作符,我們得到指標後就可以獲取到 string 方法裡了。在 fmt 輸出 x 的時候,因為 intset 值本身沒有 string 方法,所以 fmt 直接輸出了結構體。

go 語言只有一種方法控制命名的可見性:定義的時候,首字母大寫的識別符號是可以從包中匯出的,而首字母沒有大寫的則不匯出。同樣的機制也同樣作用於結構體內的字段和型別中的方法。結論就是,要封裝乙個物件,必須使用結構體。

Go 繼承中 的方法

package main import fmt 繼承中的方法 func main fmt.println p1.name,p1.age p1.eat 父類物件,訪問父類的方法 2.建立student型別 s1 student school 北京大學 fmt.println s1.name,s1.ag...

Go的方法集

方法集定義了介面的接受規則。package main import fmt type notifier inte ce type user struct func u user notify func main sendnotificatioin u func sendnotificatioin n...

Go語言的方法

目錄 方法概述 巢狀結構體中的方法呼叫 方法變數 方法表示式 封裝 儘管go沒有統一的物件導向程式設計 oop 的定義,但依然支援方法 c 中常叫做成員函式 因為對我們來說,物件就是乙個值或變數,並且擁有其方法,而方法是某種特定型別的函式。oop就是使用方法來描述每個資料結構的屬性和操作。go語言的...