最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你熟悉Go語言中函數(shù)的使用

 更新時間:2022年11月29日 09:41:32   作者:陳明勇  
這篇文章主要和大家分享一下Go語言中的函數(shù)的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定的幫助,需要的小伙伴可以參考一下

函數(shù)

函數(shù)的英文單詞是 Function,這個單詞還有著功能的意思。在 Go 語言中,函數(shù)是實(shí)現(xiàn)某一特定功能的代碼塊。函數(shù)代表著某個功能,可以在同一個地方多次使用,也可以在不同地方使用。因此使用函數(shù),可以提高代碼的復(fù)用性,減少代碼的冗余。

函數(shù)的聲明

通過案例了解函數(shù)的聲明有哪幾部分:

定義一個函數(shù),實(shí)現(xiàn)兩個數(shù)相加的功能,并將相加之后的結(jié)果返回。

func Add(num1 int, num2 int) int {
    var sum int
    sum += num1
    sum += num2
    return sum
}

通過案例可以發(fā)現(xiàn),函數(shù)的聲明有5部分:

1、關(guān)鍵字

函數(shù)的關(guān)鍵字是 func,聲明函數(shù)必須以 func 關(guān)鍵字開始。

2、函數(shù)名

Go 推薦使用駝峰命名的方式,和變量的命名規(guī)則一樣,首字母大寫的函數(shù)名可以在包外訪問,小寫的只能在包內(nèi)訪問。

3、參數(shù)列表

參數(shù)列表中聲明了在函數(shù)體里所使用到的變量。參數(shù)列表位于函數(shù)名后面,用括號包裹著,多個參數(shù)使用逗號分隔開。

4、返回值列表

返回值為函數(shù)執(zhí)行后的一個結(jié)果,上述代碼只有一個返回值,如果有多個返回值,需要用括號包裹著,返回值之間用逗號分隔開。

少數(shù)情況下,我們會聲明返回值的的名稱如 func Add(num1 int, num2 int) sum int {},多數(shù)情況下是不用聲明返回值的名稱的。

5、函數(shù)體

大括號內(nèi)就是函數(shù)體,存放著函數(shù)的具體實(shí)現(xiàn)。 函數(shù)的第 34 部分可有可無,也就是說一個函數(shù)可以沒有參數(shù)和返回值。

Go 函數(shù)支持變長參數(shù)

在上面的案例中,實(shí)現(xiàn)的功能是對兩數(shù)求和,如果我們需要對多個數(shù)求和,但又不知道具體的數(shù)量,函數(shù)的參數(shù)該怎么聲明呢?這時可以聲明變長參數(shù)去接收多個參數(shù)。

func main() {
    sum := Add(1, 2, 3, 4)
    println(sum) // 10
}

func Add(nums ...int) int {
    var sum int
    for _, num := range nums {
	sum += num
    }
    return sum
}

變長參數(shù)作為形式參數(shù)可以接收不定的實(shí)際參數(shù),聲明變長參數(shù)需要在類型面前加上 ... ??勺儏?shù)實(shí)際上是一個切片,可以通過 for-range 去操作。

匿名函數(shù)

通常情況下,如果一個函數(shù)只使用一次,我們就可以定義成匿名函數(shù)。

func main() {
    // 定義匿名函數(shù),直接調(diào)用
    result := func(num1, num2 int) int {
	return num1 + num2
    }(1, 2)
    println(result)
    // 2、將匿名函數(shù)賦值給一個變量,由變量調(diào)用
    resultFunc := func(num1, num2 int) int {
	return num1 + num2
    }
    println(resultFunc(1, 2))
}

聲明函數(shù)時,不指定函數(shù)名的函數(shù),叫做匿名函數(shù)。匿名函數(shù)可以直接調(diào)用,也可以通過賦值給變量,由變量調(diào)用。

閉包

閉包就是一個函數(shù)和其相關(guān)引用環(huán)境組合的一個整體。

import "fmt"

// 返回值為一個匿名函數(shù)
func getSum() func(int) int {
    var sum int = 0
    // 匿名函數(shù)
    result := func(num int) int {
	sum += num
	return sum
    }
    return result
}

func main() {
    f := getSum()
    fmt.Println(f(1)) // 1
    fmt.Println(f(2)) // 3
}
  • 閉包的本質(zhì)就是一個匿名函數(shù),匿名函數(shù)里使用了定義它的函數(shù)(getSum)里面的變量 sum,就組成了閉包。
  • 由上述代碼可知,匿名函數(shù)中所引用的變量 sum 會一直保存在內(nèi)存中。

init 函數(shù)

每個 go 文件都可以包含一個 init 函數(shù),它是一個初始化函數(shù),用于進(jìn)行初始化的操作。

var print = getNum()

func getNum() int {
    println("初始化變量")
    return 1
}

func main() {
    println("main...")
}

func init() {
    println("init...")
}

執(zhí)行結(jié)果:

初始化變量
init...
main...

  • 根據(jù)執(zhí)行結(jié)果可知,它們的執(zhí)行順序?yàn)椋喝肿兞?→ init 函數(shù) → main 函數(shù)。
  • 多個 go 文件都有 init 函數(shù)時,執(zhí)行順序?yàn)椋合葓?zhí)行所導(dǎo)入的模塊的 init 函數(shù),再執(zhí)行本文件的 init 函數(shù)。

函數(shù)參數(shù)詳解

形式參數(shù)與實(shí)際參數(shù)

在函數(shù)聲明的地方,參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參;而在函數(shù)調(diào)用的時候所傳遞的參數(shù)被稱為實(shí)際參數(shù),簡稱實(shí)參。舉例說明:

func main() {
    sum := Add(1, 2)
    println(sum) // 3
}
func Add(num1 int, num2 int) int {
    var sum int
    sum += num1
    sum += num2
    return sum
}

Add 后面的參數(shù)被稱為形參,而在 main 方法里,12 被稱為實(shí)參。

值傳遞

基本數(shù)據(jù)類型和數(shù)組作為實(shí)參時,默認(rèn)是按 值傳遞,即進(jìn)行值拷貝,在函數(shù)內(nèi)修改它們的值,原來的值不會改變。舉例說明:

func main() {
    num1, num2 := 1, 2
    Swap(1, 2)
    fmt.Printf("main 函數(shù)體內(nèi)打印:num1: %d, num2: %d", num1, num2)
}

func Swap(num1 int, num2 int) {
    num2, num1 = num1, num2
    fmt.Printf("Swap 函數(shù)體內(nèi)打?。簄um1: %d, num2: %d\n", num1, num2)
}

執(zhí)行結(jié)果:

Swap 函數(shù)體內(nèi)打印:num1: 2, num2: 1
main 函數(shù)體內(nèi)打?。簄um1: 1, num2: 2

Swap 函數(shù)內(nèi),num1num2 的值已經(jīng)相互交換,但是在 main 函數(shù)里,num1num2 的值沒有發(fā)生變化。

func main() {
    nums := [3]int{0, 1, 2}
    Swap(nums)
    fmt.Println("main 函數(shù)體內(nèi)打?。簄ums: ", nums)
}

func Swap(nums [3]int) {
    nums[0] = 1
    fmt.Println("Swap 函數(shù)體內(nèi)打?。簄ums: ", nums)
}

同樣傳遞數(shù)組,在函數(shù)內(nèi)修改數(shù)組的值,原數(shù)組的值并不會改變。 前面的文章有對指針進(jìn)行了介紹,指出了通過 * 操作符,可以對指針?biāo)赶虻淖兞康闹颠M(jìn)行修改,因此如果我們想要在函數(shù)內(nèi)改變外部傳過來的參數(shù)的值,函數(shù)聲明時,形參類型指定為指針類型。

func main() {
    num1, num2 := 1, 2
    Swap(&num1, &num2)
    fmt.Printf("main 函數(shù)體內(nèi)打?。簄um1: %d, num2: %d", num1, num2)
}

func Swap(num1 *int, num2 *int) {
    *num2, *num1 = *num1, *num2
    fmt.Printf("Swap 函數(shù)體內(nèi)打?。簄um1: %d, num2: %d\n", *num1, *num2)
}

執(zhí)行結(jié)果:

Swap 函數(shù)體內(nèi)打?。簄um1: 2, num2: 1
main 函數(shù)體內(nèi)打?。簄um1: 2, num2: 1

通過結(jié)果可知,使用指針變量作為形參,在函數(shù)里是可以改變外部的參數(shù)的值的。

函數(shù)是一種數(shù)據(jù)類型

Go 里面,函數(shù)是一種數(shù)據(jù)類型,因此函數(shù)還可以有很多用法,如創(chuàng)建一個函數(shù)變量、將函數(shù)作為函數(shù)的形參,將函數(shù)作為函數(shù)的返回值等。

創(chuàng)建函數(shù)變量

func main() {
    // 創(chuàng)建函數(shù)變量
    hl := Hello
    fmt.Printf("%T\n", hl) // func(string)
    hl("cmy")
}

func Hello(name string) {
    fmt.Printf("Hello %s", name)
}

創(chuàng)建一個函數(shù)變量 hl,打印 hl 的類型 → func(string),通過 hl 變量調(diào)用函數(shù)。

作為函數(shù)的形參

import "fmt"

func main() {
    Print("cmy", Hello)
}

func Hello(name string) {
    fmt.Printf("Hello %s", name)
}

func Print(name string, f func(string)) {
    f(name)
}

定義函數(shù) Print ,聲明兩個參數(shù),一個參數(shù)是 name,為 string 類型的,另一個參數(shù)是 f,為函數(shù)類型。傳入 cmyHello 函數(shù),由 Print 函數(shù)去執(zhí)行 Hello 函數(shù)。

作為函數(shù)的返回值

import "fmt"

func main() {
    f := Print()
    f()
}

func Print() func() {
    return func() {
	fmt.Println("Hello,World!")
    }
}

通過Print 函數(shù)返回一個匿名函數(shù)函數(shù),這個匿名函數(shù)的功能是輸出 Hello,World!,使用 f 變量接收這個函數(shù)并調(diào)用。

基于函數(shù)自定義類型

type AddHandleFunc func(num1, num2 int) int

func main() {
    sum := GetSum(1, 2, Add)
    println(sum)
}

func Add(num1, num2 int) int {
    return num1 + num2
}

func GetSum(num1, num2 int, handleFunc AddHandleFunc) int {
    return handleFunc(num1, num2)
}

基于函數(shù) func(num1, num2 int) int 自定義一個類型 AddHandleFunc,將它聲明為 GetSum 的形參,然后調(diào)用 GetSum 時,因?yàn)?Add 函數(shù)和 AddHandleFunc 是等價的,因此可以將 Add 當(dāng)做實(shí)參傳進(jìn)去。

小結(jié)

本文對函數(shù)的聲明進(jìn)行介紹,根據(jù)一個案例了解了其組成的5部分。然后介紹了其一些特點(diǎn)如支持變長參數(shù)、傳遞參數(shù)時,實(shí)參按值傳遞等,最后根據(jù)函數(shù)在Go中是一種數(shù)據(jù)類型的特點(diǎn),說明了其一些特別用法。

以上就是一文帶你熟悉Go語言中函數(shù)的使用的詳細(xì)內(nèi)容,更多關(guān)于Go語言函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go獲取兩個時間點(diǎn)時間差的具體實(shí)現(xiàn)

    Go獲取兩個時間點(diǎn)時間差的具體實(shí)現(xiàn)

    本文主要介紹了Go獲取兩個時間點(diǎn)時間差的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Go/C語言LeetCode題解997找到小鎮(zhèn)法官

    Go/C語言LeetCode題解997找到小鎮(zhèn)法官

    這篇文章主要為大家介紹了Go語言LeetCode題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解Go語言如何判斷兩個對象是否相等

    詳解Go語言如何判斷兩個對象是否相等

    在編程中,判斷兩個對象是否相等是一項(xiàng)常見的任務(wù),同時判斷對象是否相等在很多情況下都非常重要,所以在接下來的內(nèi)容中,我們將詳細(xì)介紹在?Go?語言中如何判斷對象是否相等的方法和技巧,需要的可以參考一下
    2023-06-06
  • Golang使用反射的動態(tài)方法調(diào)用詳解

    Golang使用反射的動態(tài)方法調(diào)用詳解

    Go是一種靜態(tài)類型的語言,提供了大量的安全性和性能。這篇文章主要和大家介紹一下Golang使用反射的動態(tài)方法調(diào)用,感興趣的小伙伴可以了解一下
    2023-03-03
  • 使用go net實(shí)現(xiàn)簡單的redis通信協(xié)議

    使用go net實(shí)現(xiàn)簡單的redis通信協(xié)議

    本文主要介紹了go net實(shí)現(xiàn)簡單的redis通信協(xié)議,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言中的各類運(yùn)算操作符詳解

    Go語言中的各類運(yùn)算操作符詳解

    本文全面探討了Go語言中的各類運(yùn)算操作符,從基礎(chǔ)的數(shù)學(xué)和位運(yùn)算到邏輯和特殊運(yùn)算符,文章旨在深入解析每一種運(yùn)算操作符的工作原理、應(yīng)用場景和注意事項(xiàng),以幫助開發(fā)者編寫更高效、健壯和可讀的Go代碼,</P><P>
    2023-09-09
  • Go語言學(xué)習(xí)教程之指針的示例詳解

    Go語言學(xué)習(xí)教程之指針的示例詳解

    這篇文章主要通過簡單的練習(xí)來讓大家對Go語言中的指針有所了解,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Go語言有一定幫助,需要的可以參考一下
    2022-09-09
  • 使用Go語言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解

    使用Go語言實(shí)現(xiàn)Yaml編碼和解碼的方法詳解

    在這篇文章中,我們將介紹如何使用Go語言編寫代碼來實(shí)現(xiàn)Yaml編碼和解碼,文中有詳細(xì)的代碼示例供大家參考,對大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • Mac GoLand打不開(閃退)也不報錯的解決方案

    Mac GoLand打不開(閃退)也不報錯的解決方案

    這篇文章主要介紹了Mac GoLand打不開(閃退)也不報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 淺談go語言中別名類型的使用

    淺談go語言中別名類型的使用

    類型別名是 Go 1.9 版本添加的新功能,主要用于解決代碼升級、遷移中存在的類型兼容性問題,本文主要介紹了go語言中別名類型的使用,感興趣的可以了解一下
    2024-01-01

最新評論

固安县| 蛟河市| 宿松县| 琼结县| 革吉县| 荔波县| 神农架林区| 北安市| 咸宁市| 吴旗县| 孝义市| 清丰县| 萨迦县| 恭城| 双峰县| 乐至县| 马山县| 宁明县| 理塘县| 绩溪县| 昌平区| 青川县| 惠水县| 阜阳市| 嘉定区| 太仆寺旗| 望江县| 宜良县| 双鸭山市| 福安市| 白朗县| 彰武县| 城市| 新邵县| 句容市| 壶关县| 大邑县| 都安| 高碑店市| 凉山| 冷水江市|