Go語言之method
阿新 • • 發佈:2018-04-13
method方法method
- Go 中雖沒有class, 但依舊有method
- 通過顯示說明receiver來實現與某個類型的組合
- 只能為同一個包中的類型定義方法
- receiver可以是類型的值或指針
- 不存在方法重載
- 可以使用值或者指針來調用方法,編譯器會自動完成轉換
- 從某種意義上來說,方法是函數的語法糖,因為receiver其實就是方法所接收的第一個參數(Method Value vs. Method Express)
- 如果外部結構和嵌入結構存在同名方法,則優先調用外部結構的方法
- 類型別名不會擁有底層類型所附帶的方法
- 方法可以調用結構中的非公開字段
1、創建method
//創建方法 package main import "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 main import "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 main import "fmt" type TZ int func 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 main
import "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變成100
package main
import "fmt"
//為int 聲明一個別名
type intFor int
func main() {
var a intFor = 0
fmt.Println(a.Increase())
}
//傳的地址
//註意,返回值的類型是intFor
func (arg *intFor)Increase() intFor {
//添加上*,就表示取地址裏的內容了
*arg = 100
return *arg
}
總結:
例如,type intFor int,
不光是int類型,也可以是其他類型。
開始擴展思維,其實,就是為某個類型,增加方法;
Java裏的一個類裏包括屬性,以及方法;
在Go語言中,各種屬性是封裝在一個類型裏,方法是通過receiver來綁定;
只是不同的表現形式而已
Go語言之method