首頁 >後端開發 >Golang >go語言中函數與方法有什麼差別

go語言中函數與方法有什麼差別

王林
王林原創
2021-02-07 11:56:355419瀏覽

go語言中函數與方法的區別:對於普通函數,接收者為值類型時,不能將指標類型的資料直接傳遞;對於方法,接收者為值類型時,可以直接用指標類型的變數呼叫方法。

go語言中函數與方法有什麼差別

本文操作環境:windows10系統、Go 1.11.2、thinkpad t480電腦。

函數與方法的區別官方解釋:一個方法就是一個包含了接收者的函數。接收者可以是命名類型或是結構體類型的一個值或是指標。所有給定類型的方法屬於該類型的方法集。

區別:

1、對於普通函數:接收者(函數參數)為值類型時,無法將指標類型的資料直接傳遞,反之亦然。

func function_name([parameter list]) [return_types] {
   函数体
}

2、對於方法(如struct方法): 接收者為值型別時,可以直接用指標型別的變數呼叫方法,反之亦然

func (variable_name variable_data_type) function_name() [return_type]{
   /* 函数体*/
   }

可以看到方法和函數的區別,方法在func關鍵字後是接收者而不是函數名,接收者可以是自己定義的一個類型,這個類型可以是struct,interface,甚至我們可以重定義基本資料類型。

Go函數

函數是基本的程式碼區塊,用來執行一個任務。

Go 語言最少有個 main() 函數。

你可以透過函數來分割不同功能,邏輯上每個函數執行的是指定的任務。

函數宣告告訴了編譯器函數的名稱,傳回類型,和參數。

Go 函數可以傳回多個值。

Go 語言標準函式庫提供了多種可動用的內建的函數。例如,len() 函數可以接受不同類型參數並傳回該類型的長度。如果我們傳入 的是字串則傳回字串的長度,如果傳入的是數組,則傳回數組中包含的元素個數。

1、值傳遞:值傳遞是指在呼叫函數時將實際參數複製一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。

2、引用傳遞:引用傳遞是指在呼叫函數時將實際參數的位址傳遞到函數中,那麼在函數中對參數所進行的修改,將影響到實際參數。

Go方法

Go 語言中同時有函數和方法。一個方法就是一個包含了接受者的函數,接受者可以是命名類型或是結構體類型的一個值或是指標。所有給定類型的方法屬於該類型的方法集。

下面定義一個結構體類型和該類型的一個方法:

package mainimport (   "fmt"  )/* 定义结构体 */type Circle struct {
  radius float64
}func main() {  var c1 Circle
  c1.radius = 10.00
  fmt.Println("Area of Circle(c1) = ", c1.getArea())
}//该 method 属于 Circle 类型对象中的方法func (c Circle) getArea() float64 {  //c.radius 即为 Circle 类型对象中的属性
  return 3.14 * c.radius * c.radius
}

(學習影片分享:程式設計入門

以上程式碼執行結果為:

Area of Circle(c1) =  314

範例

 package structTest  
      
    //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候)  
    //Date:2014-4-3 10:00:07  
      
    import (  
        "fmt"  
    )  
      
    func StructTest06Base() {  
        structTest0601()  
        structTest0602()  
    }  
      
    //1.普通函数  
    //接收值类型参数的函数  
    func valueIntTest(a int) int {  
        return a + 10  
    }  
      
    //接收指针类型参数的函数  
    func pointerIntTest(a *int) int {  
        return *a + 10  
    }  
      
    func structTest0601() {  
        a := 2  
        fmt.Println("valueIntTest:", valueIntTest(a))  
        //函数的参数为值类型,则不能直接将指针作为参数传递  
        //fmt.Println("valueIntTest:", valueIntTest(&a))  
        //compile error: cannot use &a (type *int) as type int in function argument  
      
        b := 5  
        fmt.Println("pointerIntTest:", pointerIntTest(&b))  
        //同样,当函数的参数为指针类型时,也不能直接将值类型作为参数传递  
        //fmt.Println("pointerIntTest:", pointerIntTest(b))  
        //compile error:cannot use b (type int) as type *int in function argument  
    }  
      
    //2.方法  
    type PersonD struct {  
        id   int  
        name string  
    }  
      
    //接收者为值类型  
    func (p PersonD) valueShowName() {  
        fmt.Println(p.name)  
    }  
      
    //接收者为指针类型  
    func (p *PersonD) pointShowName() {  
        fmt.Println(p.name)  
    }  
      
    func structTest0602() {  
        //值类型调用方法  
        personValue := PersonD{101, "Will Smith"}  
        personValue.valueShowName()  
        personValue.pointShowName()  
      
        //指针类型调用方法  
        personPointer := &PersonD{102, "Paul Tony"}  
        personPointer.valueShowName()  
        personPointer.pointShowName()  
      
        //与普通函数不同,接收者为指针类型和值类型的方法,指针类型和值类型的变量均可相互调用  
    }

相關推薦:golang教學

以上是go語言中函數與方法有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn