Go語言之method
方法method
Go 中雖沒有class, 但依舊有method
透過顯示說明receiver來實現與某個型別的組合
只能為同一個包中的型別定義方法
receiver可以是型別的值或指標
不存在方法過載
可以使用值或者指標來呼叫方法,編譯器會自動完成轉換
從某種意義上來說,方法是函式的語法糖,因為receiver其實就是方法所接收的第一個引數(Method Value vs. Method Express)
如果外部結構和嵌入結構存在同名方法,則優先呼叫外部結構的方法
型別別名不會擁有底層型別所附帶的方法
方法可以呼叫結構中的非公開欄位
1、建立method
//建立方法package mainimport "fmt"type book struct { Name string}type eleBook struct { Name string}func main() { //建立一個物件 aBook := book{Name:"spark computer"} aBook.show() bBook := eleBook{Name:"k8s computer"} bBook.show()}//建立一個method//此mothod方法屬於book型別//(a book) 這個欄位 是說// 此方法,屬於哪型別,是跟型別繫結的// (a book)就是一個receiver//只能指定的型別的變數,才能呼叫//方法的繫結,只能是同一個包中,才起作用func (a book) show() { fmt.Println("this is book:t",a.Name)}// 這屬於過載了//func (a book) show(info string) {// fmt.Println("this is book")//}//建立一個method//此mothod方法屬於eleBook型別func (a eleBook) show() { fmt.Println("this is ele book")}
2、receiver 按引用傳遞 測試
package mainimport "fmt"type flower struct { Name string}type rose struct { Name string}func main() { flower := flower{Name:"a big flower"} rose := rose{Name:"a big rose"} fmt.Println("init flower:t", flower) flower.show() fmt.Println("after flower:t", flower) fmt.Println("===========================") fmt.Println("init rose:t", rose) rose.show() fmt.Println("after rose:t", rose)}//(flower flower) 這種方式,是按值傳遞的,不能改變原值的func (flower flower)show() { flower.Name = "I'm flower" fmt.Println("flower:t", flower)}//(rose *rose) 是按引用傳遞的,可以改變原值的func (rose *rose)show() { rose.Name = " this is rose" fmt.Println("rose:t", rose)}
3、測試 別名 與 方法的繫結
//別名 與 方法的繫結// 作用,就是,有一種增強的感覺,如int型別,本身沒有show,add方法//別名 與 方法的組合,確有了package mainimport "fmt"type TZ intfunc main() { var ty TZ = 3 fmt.Println("ty:t" , ty) //Method value 呼叫方式,透過型別的變數來呼叫 ty.show() ty.add() fmt.Println("==================Method value Method Express的不同==============================") //對方法的兩種不同的導呼叫方式而已 //Method express 呼叫方式,透過型別直接來呼叫 //此種方式,需要自己輸入 變數 //因為receiver接收的是地址,因此,我們傳入的是地址 (*TZ).show(&ty) (*TZ).add(&ty)}//下面的這些方法,都是透過 某一個型別的 變數 來進行呼叫的//java 是透過物件來呼叫的func (tz *TZ)show() { fmt.Println("---->:t 這是int型別", *tz) //tz是地址,*tz 是取地址裡的內容了}func (tz *TZ)add() { fmt.Println("---->:t 這是int型別的加法")}
4、方法訪問屬性 的許可權 測試
//方法 的許可權問題,是否可以訪問 私有欄位呢?//許可權是以package 為級別的//方法的訪問許可權是很高的,可以訪問同一個package下的所有屬性,包括公共的,私有的package mainimport "fmt"type bike struct { //小寫是私有屬性,私有屬性,只能在同一個package內,進行訪問的 name string //大寫是公共屬性 Color string}func main() { bike := bike{name:"捷安特", Color:"黑色"} fmt.Println("old bike:t", bike) //透過型別的變數,來呼叫方法 bike.show() fmt.Println("new bike:t", bike)}func (bike *bike)show() { bike.Color = "紅色" bike.name = "永久" //看見了吧,方法是可以訪問同一package下的私有屬性的 fmt.Println("bike:t", bike)}
5、練習題
//練習題://依據的理論知識:為結構增加方法的知識//嘗試宣告一個底層型別為int的型別//並實現呼叫某個方法就遞增100//如 a:=0, 呼叫a.Increase()只會,a從0變成100package mainimport "fmt"//為int 宣告一個別名type intFor intfunc main() { var a intFor = 0 fmt.Println(a.Increase())}//傳的地址//注意,返回值的型別是intForfunc (arg *intFor)Increase() intFor { //新增上*,就表示取地址裡的內容了 *arg = 100 return *arg}
總結:
例如,type intFor int,
不光是int型別,也可以是其他型別。
開始擴充套件思維,其實,就是為某個型別,增加方法;
Java裡的一個類裡包括屬性,以及方法;
在Go語言中,各種屬性是封裝在一個型別裡,方法是透過receiver來繫結;
只是不同的表現形式而已
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1817/viewspace-2817725/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Go語言之介面Go
- Go語言之ContextGoContext
- Go語言之 Struct TagGoStruct
- go語言之反射-------ReflectionGo反射
- 深度解密 Go 語言之 channel解密Go
- 深度解密Go語言之 map解密Go
- 深度解密Go語言之Slice解密Go
- 深度解密Go語言之channel解密Go
- 深度解密GO語言之反射解密Go反射
- Go語言之讀寫鎖Go
- Go語言之包(package)管理GoPackage
- 深度解密Go語言之context解密GoContext
- 深度解密 Go 語言之 context解密GoContext
- go語言之陣列與切片Go陣列
- Go語言之併發示例(Runner)Go
- Go語言之旅:基本型別Go型別
- Go語言之錯誤處理Go
- 深度解密 Go 語言之 sync.Pool解密Go
- 深度解密 Go 語言之 sync.map解密Go
- go語言之結構體和方法Go結構體
- Go語言之併發示例-Pool(二)Go
- Go語言之併發示例-Pool(一)Go
- Go語言之於系統管理員Go
- 在 Fefora 上開啟 Go 語言之旅Go
- Go語言之變數逃逸(Escape Analysis)分析Go變數
- Go語言之陣列快速入門篇Go陣列
- Go語言之切片(slice)快速入門篇Go
- python和GO語言之間的區別!PythonGo
- 深入理解GO語言之併發機制Go
- Go語言之Goroutine與通道、異常處理Go
- Go語言之對映(map)快速入門篇Go
- 深入理解GO語言之記憶體詳解Go記憶體
- 深度解密Go語言之關於 interface 的10個問題解密Go
- 《碼農群英傳》連載(一) —— Go 語言之父 Rob PikeGo
- Python和GO語言之間的區別是什麼?PythonGo
- JAVA語言之SetJava
- C語言之家C語言
- Go 語言之對不同型別的資料進行分組Go型別