溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言怎么調(diào)用函數(shù)

發(fā)布時間:2022-12-02 09:40:50 來源:億速云 閱讀:138 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“go語言怎么調(diào)用函數(shù)”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“go語言怎么調(diào)用函數(shù)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

在go語言中,定義了函數(shù)之后,我們可以通過“函數(shù)名()”的方式調(diào)用函數(shù),語法“返回值變量列表 = 函數(shù)名(參數(shù)列表)”。當“()”中包含多個參數(shù)時,參數(shù)變量以逗號分隔,尾部無須以分號結(jié)尾;“返回值變量列表”中,多個返回值使用逗號分隔。

函數(shù)構(gòu)成了代碼執(zhí)行的邏輯結(jié)構(gòu),在Go語言中,函數(shù)的基本組成為:關鍵字 func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語句,每一個程序都包含很多的函數(shù),函數(shù)是基本的代碼塊。

因為Go語言是編譯型語言,所以函數(shù)編寫的順序是無關緊要的,鑒于可讀性的需求,最好把 main() 函數(shù)寫在文件的前面,其他函數(shù)按照一定邏輯順序進行編寫(例如函數(shù)被調(diào)用的順序)。

編寫多個函數(shù)的主要目的是將一個需要很多行代碼的復雜問題分解為一系列簡單的任務來解決,而且,同一個任務(函數(shù))可以被多次調(diào)用,有助于代碼重用(事實上,好的程序是非常注意 DRY 原則的,即不要重復你自己(Don't Repeat Yourself),意思是執(zhí)行特定任務的代碼只能在程序里面出現(xiàn)一次)。

當函數(shù)執(zhí)行到代碼塊最后一行 } 之前或者 return 語句的時候會退出,其中 return 語句可以帶有零個或多個參數(shù),這些參數(shù)將作為返回值供調(diào)用者使用,簡單的 return 語句也可以用來結(jié)束 for 的死循環(huán),或者結(jié)束一個協(xié)程(goroutine)。

Go語言里面擁三種類型的函數(shù):

  • 普通的帶有名字的函數(shù)

  • 匿名函數(shù)或者 lambda 函數(shù)

  • 方法

普通函數(shù)聲明(定義)

函數(shù)聲明包括函數(shù)名、形式參數(shù)列表、返回值列表(可省略)以及函數(shù)體。

func 函數(shù)名(形式參數(shù)列表)(返回值列表){
    函數(shù)體
}

形式參數(shù)列表描述了函數(shù)的參數(shù)名以及參數(shù)類型,這些參數(shù)作為局部變量,其值由參數(shù)調(diào)用者提供,返回值列表描述了函數(shù)返回值的變量名以及類型,如果函數(shù)返回一個無名變量或者沒有返回值,返回值列表的括號是可以省略的。

調(diào)用函數(shù)

函數(shù)在定義后,可以通過調(diào)用的方式,讓當前代碼跳轉(zhuǎn)到被調(diào)用的函數(shù)中進行執(zhí)行,調(diào)用前的函數(shù)局部變量都會被保存起來不會丟失,被調(diào)用的函數(shù)運行結(jié)束后,恢復到調(diào)用函數(shù)的下一行繼續(xù)執(zhí)行代碼,之前的局部變量也能繼續(xù)訪問。

函數(shù)內(nèi)的局部變量只能在函數(shù)體中使用,函數(shù)調(diào)用結(jié)束后,這些局部變量都會被釋放并且失效。

Go語言的函數(shù)調(diào)用格式如下:

返回值變量列表 := 函數(shù)名(參數(shù)列表)

下面是對各個部分的說明:

  • 函數(shù)名:需要調(diào)用的函數(shù)名。

  • 參數(shù)列表:參數(shù)變量以逗號分隔,尾部無須以分號結(jié)尾。

  • 返回值變量列表:多個返回值使用逗號分隔。

例如,加法函數(shù)調(diào)用樣式如下:

result := add(1,1)

函數(shù)的返回值

Go語言支持多返回值,多返回值能方便地獲得函數(shù)執(zhí)行后的多個返回參數(shù),Go語言經(jīng)常使用多返回值中的最后一個返回參數(shù)返回函數(shù)執(zhí)行中可能發(fā)生的錯誤,示例代碼如下:

復制純文本復制
conn, err := connectToNetwork()

conn, err := connectToNetwork()

在這段代碼中,connectToNetwork 返回兩個參數(shù),conn 表示連接對象,err 返回錯誤信息。

其它編程語言中函數(shù)的返回值
  • C/C++ 語言中只支持一個返回值,在需要返回多個數(shù)值時,則需要使用結(jié)構(gòu)體返回結(jié)果,或者在參數(shù)中使用指針變量,然后在函數(shù)內(nèi)部修改外部傳入的變量值,實現(xiàn)返回計算結(jié)果,C++ 語言中為了安全性,建議在參數(shù)返回數(shù)據(jù)時使用“引用”替代指針。

  • C# 語言也沒有多返回值特性,C# 語言后期加入的 ref 和 out 關鍵字能夠通過函數(shù)的調(diào)用參數(shù)獲得函數(shù)體中修改的數(shù)據(jù)。

  • lua 語言沒有指針,但支持多返回值,在大塊數(shù)據(jù)使用時方便很多。

Go語言既支持安全指針,也支持多返回值,因此在使用函數(shù)進行邏輯編寫時更為方便。

1) 同一種類型返回值

如果返回值是同一種類型,則用括號將多個返回值類型括起來,用逗號分隔每個返回值的類型。

使用 return 語句返回時,值列表的順序需要與函數(shù)聲明的返回值類型一致,示例代碼如下:

復制純文本復制
func typedTwoValues() (int, int) {
   return 1, 2
}
func main() {
   a, b := typedTwoValues()
   fmt.Println(a, b)
}

func typedTwoValues() (int, int) {
    return 1, 2
}
func main() {
    a, b := typedTwoValues()
    fmt.Println(a, b)
}

代碼輸出結(jié)果:

1 2

純類型的返回值對于代碼可讀性不是很友好,特別是在同類型的返回值出現(xiàn)時,無法區(qū)分每個返回參數(shù)的意義。

2) 帶有變量名的返回值

Go語言支持對返回值進行命名,這樣返回值就和參數(shù)一樣擁有參數(shù)變量名和類型。

命名的返回值變量的默認值為類型的默認值,即數(shù)值為 0,字符串為空字符串,布爾為 false、指針為 nil 等。

下面代碼中的函數(shù)擁有兩個整型返回值,函數(shù)聲明時將返回值命名為 a 和 b,因此可以在函數(shù)體中直接對函數(shù)返回值進行賦值,在命名的返回值方式的函數(shù)體中,在函數(shù)結(jié)束前需要顯式地使用 return 語句進行返回,代碼如下:

復制純文本復制
func namedRetValues() (a, b int) {
   a = 1
   b = 2
   return
}

func namedRetValues() (a, b int) {

    a = 1
    b = 2

    return
}

代碼說明如下:

  • 第 1 行,對兩個整型返回值進行命名,分別為 a 和 b。

  • 第 3 行和第 4 行,命名返回值的變量與這個函數(shù)的布局變量的效果一致,可以對返回值進行賦值和值獲取。

  • 第 6 行,當函數(shù)使用命名返回值時,可以在 return 中不填寫返回值列表,如果填寫也是可行的,下面代碼的執(zhí)行效果和上面代碼的效果一樣。

    復制純文本復制



    func namedRetValues() (a, b int) {
       a = 1
       return a, 2
    }

    func namedRetValues() (a, b int) {
        a = 1

        return a, 2
    }


提示

同一種類型返回值和命名返回值兩種形式只能二選一,混用時將會發(fā)生編譯錯誤,例如下面的代碼:

復制純文本復制
func namedRetValues() (a, b int, int)

func namedRetValues() (a, b int, int)

編譯報錯提示:

mixed named and unnamed function parameters

意思是:在函數(shù)參數(shù)中混合使用了命名和非命名參數(shù)。

讀到這里,這篇“go語言怎么調(diào)用函數(shù)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內(nèi)容的文章,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI