golang基礎--method方法

來源:互聯網
上載者:User
  • Go沒有類似python語言中類class的概念,但依舊有method

    • 類型方法定義格式如下
      func (a mytype) method_name(x type)(y type){ return y }
    • 調用方式:
      instance.method(args) -> (type).func(instance, args)
  • 通過顯示的說明Receiver(強制函數傳遞的第一個參數)來實現與某個類型(struct,int...)的組合

    package mainimport "fmt"type A struct{    Name Sting}func main() {    a := A{}                                        //執行個體化結構體    a.Method_Print()                                //結構體調用方法}func (a A) Method_Print() {                         //強制將A(struct類型)作為第一個參數傳遞給Method_Print,從而說明此函數屬於結構A的一個方法    fmt.Println("This is a method for struct A")}/*輸出This is a method for struct A*/
  • 只能為同一個包package中的類型定義方法(method),不能為非本package中的類型定義方法,但是方法(這裡指公有方法)是可以在其它包中調用。

  • 可以只用值或指標來調用方法,編譯器會自動完成轉換

    package mainimport "fmt"type A struct {    Name string}type B struct {    Name string}func main() {    a := A{}                //執行個體化結構體    a.Method_Print()        //結構體調用方法    fmt.Println(a.Name)     //指標傳遞時,不用使用`*a.Name`,解譯器自動識別    b := B{}    fmt.Println(b.Name)    b.Method_Print()}func (a *A) Method_Print() {                        //方法傳遞結構體指標    a.Name = "maozi"    fmt.Println("This is a method for struct A")}func (b B) Method_Print() {                         //方法:傳遞結構    b.Name = "Sazi"                                 //這種方式只能進行值的拷貝,無法變更結構體屬性(欄位)    fmt.Println("This is a method for struct B")}/*輸出a.Method_Print---   This is a method for struct Aa.Name---           maozib.Name--            //空值,修改失敗b.Method_Print      This is a method for struct B*/
  • 類型別名(如下代碼INT為int類型的別名)不會擁有底層類型所附帶的方法;可以為任一底層類型(int...)綁定一個方法,如下Method_Print

    package mainimport "fmt"type INT int                                        //自訂一個類型INT,底層為int類型,INT就是底層類型int的一個別名func main() {    var a INT    a.Method_Print()}func (a *INT) Method_Print() {                      //為int類型綁定一個方法    fmt.Println("This is a method for int type ")}/*輸出a.Method_Print---This is a method for int type*/
  • Method Values 和 Method Expressions
    • Method Value 是封裝後的狀態物件,總是與特定的對象執行個體關聯在一起
    • 調用方式類似python類的調用方式,先執行個體化一個類,在通過.屬性調用

    • Method Expression是直接類型.method(var) 的方式

    package mainimport "fmt"type INT int //定義一個INTfunc main() {    var a INT    a.Method_Print()                            //method value調用方式    (*INT).Method_Print(a)                      //method expression調用方式}func (a *INT) Method_Print() {                  //為int類型綁定一個方法    fmt.Println("This is a method for int type ")}/*輸出a.Method_Print---This is a method for int type*/
  • 類方法名稱衝突類似與欄位的名稱衝突,按繼承順序;如果外部結構和嵌入的結構體存在同名方法,則優先調用外部結構體的方法

  • 類方法存取權限:大寫首字母表示外部可以訪問,小寫表示結構體類型的私人欄位,私人欄位和方法只能在同一個包中調用,只有公有方法(首字母大寫)可以在包外調用

    package mainimport "fmt"type A struct {    name string //小寫首字母,私人欄位} func main() {    a := A{}    a.Method_Print() //method value調用方式}func (a *A) Method_Print() {                                        a.name = "123"                                              //方法可以訪問私人欄位    fmt.Println("This is a method for struct type ")}/*輸出a.Method_Print---This is a method for int type*/
  • 聲明一個底層為int的類型,實現調用一個方法就遞增250, 如x:=0,調用a.Increase(num)後,a從0變為250

        package mainimport "fmt"type Ad int                       //聲明底層類型為int類型    func main() {    var x Ad    x.Add(250)                   //method value調用方式,方法傳遞參數num=100    fmt.Println(a)}func (ad *Ad) Add(num int) {    //為int類型綁定一個方法    *ad += Ad(num)              //強制類型轉換為底層Ad---int型}/*輸出a--->250*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.