Go語言之method

來源:互聯網
上載者:User

標籤: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來綁定;
只是不同的表現形式而已

Go語言之method

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.