首頁 > 軟體

一文了解Go語言中的函數與方法的用法

2022-07-05 14:03:55

函數定義語法

與大部分語言一致,Go語言中的函數定義與其他語言基本一致

func function_name(Parameter-list) {
    // function body...
}

func function_name(Parameter-list) Return-Type {
    // function body...
}

func function_name(Parameter-list) (Multiple Return-Types){
    // function body..
}

func: 函數定義關鍵字

function_name: 函數名稱,Go語言主要使用camel-case(駝峰)命名的方式,還根據函數的性質,用首字母大小寫區分作用,具體會在後面專門的章節講解Go語言的規範

Parameter-list: 參數列,如果沒有可以忽略

Return-Type/Multiple Return-Types: 返回值的型別,即return返回值的型別,這裡特別將三種形式進行了區分:

  • 無返回值/單一返回值/多返回值
  • 另外兩種的細小的區別在於括號的使用,單一返回型別一般不再新增括號,而多返回值則需要新增括號
  • 另外為了美觀,參數列後面的括號,建議與返回型別之間有一個空格

函數定義範例

無返回值函數

func HelloFunc() {
    fmt.Println("Hello, World")
}

單一返回值函數

本範例中演示了引數定義方法和返回值型別定義方法

func HelloFunc(msg string) string {
    return "Hello, " + msg
}

多返回值函數

第二個返回值的型別通常用於回傳錯誤,這樣方便程式進行例外處理

func HelloFunc(msg string) (string, error) {
    return "Hello, " + msg, nil
}

我們再來看一下完整的程式碼實現,主函數中呼叫HelloFunc時,也需要兩個變數接收相應的值

package main

import "fmt"

func HelloFunc(msg string) (string, error) {
    return "Hello, " + msg, nil
}

func main() {
    printString, err := HelloFunc("World")
    if err == nil {
        fmt.Println(printString)
    }
}

方法(Method)定義

Go語言中並沒有類,所以在Go語言中提供了一種類似函數定義的方法定義,通過在函數名稱前增加Reciever型別,實現一種類似類中方法的定義,方法可以使用Reciver的屬性。我們來看一下語法:

func (Reciever-Name Type) function_name(Parameter-list) (Multiple Return-Types){
    // function body..
}

由於大部分定義內容與上述函數定義相同,這裡就不再贅述,只介紹一下新增的部分:

Reciever-Name:型別必須是自定義型別,不能是內建的int, string等,使用的話,在編譯階段就會報錯

方法(Method)範例

基本型別

我們來看一個通過基本型別實現的方法,這裡使用到了一個未曾學習到的知識點——自定義型別type,後面還會詳細講解,不用在此處糾結。這句含義就是通過自定義型別mystring再次定義的變數,本質上與string同一型別。

type mystring string

這裡注意我們的函數定義,在函數名前,多了(msg mystring)的定義,而在函數體內,我們也可以直接使用msg

func (msg mystring) HelloFunc() {
    str := "Hello, " + msg
    fmt.Println(str)
}

而在main函數中進行呼叫時,與上面的函數呼叫不同,我們直接使用呼叫mymsg的方法HelloFunc,實現了與上面例子類似的方法

var mymsg mystring
mymsg = "World"
mymsg.HelloFunc()

完整程式碼如下所示

package main

import "fmt"

type mystring string

func (msg mystring) HelloFunc() {
    str := "Hello, " + msg
    fmt.Println(str)
}

func main() {
    var mymsg mystring
    mymsg = "World"
    mymsg.HelloFunc()
}

結構體型別

其實從各個專案的原始碼來看,方法還是更多的與結構體(struct)和介面(interface)一起使用,這些都會在後面進行詳細講解,這裡只需要瞭解即可。這裡介紹一個簡單的例子,我們來計算長方形的面積。

  • 定義了一個結構體rect,其中包含長和寬兩個屬性
  • 計算面積的方法area(),Reciver定義為結構體型別,這樣方法體內,就可以使用長和寬計算面積
  • 主函數中,定義了一個結構體,並且初始化長和寬分別為3和4
  • 呼叫自定義結構體的r.area()完成面積計算
package main

import "fmt"

type rect struct {
    width float64
    height float64
}

func (r rect) area() float64 {
    return r.width * r.height
}

func main() {
    r := rect{3, 4}
    rectArea := r.area()
    fmt.Printf("Rect area is %vn", rectArea)
}

到此這篇關於一文了解Go語言中的函數與方法的用法的文章就介紹到這了,更多相關Go語言 函數 方法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com