日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang 函数function

發(fā)布時(shí)間:2025/3/14 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang 函数function 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(shù)function

  • Go函數(shù)不支持嵌套、重載和默認(rèn)參數(shù)
  • 但支持以下特性:

  • 無需聲明原型
  • 不定長(zhǎng)度變參
  • 多返回值
  • 命名返回值參數(shù)
  • 匿名函數(shù)
  • 閉包
    • 定義函數(shù)使用關(guān)鍵字func,且左大括號(hào)不能另起一行
    • 函數(shù)也可以作為一種類型使用

    返回值及參數(shù)說明

    func A(a int, b string) (int, string, int) { //第一個(gè)小括號(hào)當(dāng)中是你的參數(shù)列表,第二個(gè)小括號(hào)是你的返回值列表} func A(a, b, c int) (int, string, int) {//如果abc都是int型的話,可以按照這種方法進(jìn)行簡(jiǎn)寫,同樣的方法也適用于返回值當(dāng)中} func A() (a, b, c int) { //1:如果這樣寫的話就必須要命名返回值//命名返回值和不命名返回值得區(qū)別 } func A() (int, int, int) { ////命名返回值和不命名返回值得區(qū)別a, b, c := 1,2,3return a,b,c//如果此時(shí)沒有命名返回值的時(shí)候,那么在返回值得時(shí)候就必須寫上return a,b,c//當(dāng)然為了代碼的可讀性,這里我們規(guī)定必須return 的時(shí)候加上返回值名 }

    不定長(zhǎng)變參

    package mainimport "fmt"func main() {A(1,2,3,4,5,6,7)}func A(a ...int) {// 這里采用的是不定長(zhǎng)變參,不定長(zhǎng)變參必須是參數(shù)的最后一個(gè)參數(shù),后面不能再跟 b string這樣的參數(shù)fmt.Println(a) } package mainimport "fmt"func main() {s1:= []int{1,2,3,4}a,b :=1,2A(a,b)fmt.Println(a,b)B(s1)fmt.Println(s1)}func A(a ...int) {//這里傳進(jìn)來的實(shí)際上是一個(gè)slice,引用類型a[0] = 3a[1] = 4//盡管我們?cè)诤瘮?shù)A當(dāng)中接收到的是一個(gè)slice,但是它得到的是一個(gè)值拷貝//和直接傳遞一個(gè)slice的區(qū)別看函數(shù)Bfmt.Println(a) } func B(s []int) {//這里并不是傳遞一個(gè)指針進(jìn)去,而是對(duì)這個(gè)slice的內(nèi)存地址進(jìn)行了一個(gè)拷貝//這里還可以看到像int型、string型進(jìn)行常規(guī)的參數(shù)傳進(jìn)去的話,只是進(jìn)行了個(gè)值拷貝,slice傳進(jìn)去雖然也是拷貝,但是它是內(nèi)存地址的拷貝s[0] = 4s[1] = 5s[2] = 6s[3] = 7fmt.Println(s)//在這里 我們看到我們?cè)诤瘮?shù)B當(dāng)中的修改,實(shí)際上影響到了我們main函數(shù)當(dāng)中的變量s1//如果直接傳遞一個(gè)slice,它的修改就會(huì)影響到這個(gè)slice的本身}PS:值類型和引用類型進(jìn)行函數(shù)傳參拷貝是不一樣的,一個(gè)是拷貝值,一個(gè)是拷貝地址 package mainimport ("fmt" )func main() {a := 1A(&a) //這里取出a的地址fmt.Println(a)}func A(a *int) { //傳遞的是指針類型*a = 2 //在操作的時(shí)候需要去它的值進(jìn)行操作,這個(gè)時(shí)候函數(shù)A就可以改變?cè)糰的值fmt.Println(*a) }

    函數(shù)類型的使用

    package mainimport ("fmt" )func main() {a := Aa() //這個(gè)時(shí)候是將A的函數(shù)類型賦值給a,在go語言當(dāng)中一切皆是類型啊} func A() {fmt.Println("Func A") }

    匿名函數(shù)的使用

    package mainimport ("fmt" )func main() {a := func() {//此時(shí)這個(gè)代碼塊就是一個(gè)匿名函數(shù),這個(gè)函數(shù)本身沒有名稱,我們將她賦值給a,然后調(diào)用fmt.Println("Func A")}a() //依然可以打印func A }

    GO語言當(dāng)中的閉包

    package mainimport ("fmt" )func main() {f := closure(10)res1 := f(1)fmt.Println(res1)res2 := f(2)fmt.Println(res2)}func closure(x int) func(int) int {fmt.Printf("%p \n", &x)return func(y int) int {fmt.Printf("%p \n", &x)return x + y} } //這里可以看出3次打印x的地址都是一樣的

    defer

    • defer的執(zhí)行方式類似其它語言中的析構(gòu)函數(shù),在函數(shù)執(zhí)行體結(jié)束后按照調(diào)用順序的相反順序逐個(gè)執(zhí)行
    • 即使函數(shù)發(fā)生嚴(yán)重錯(cuò)誤也會(huì)執(zhí)行
    • 支持匿名函數(shù)的調(diào)用
    • 通常用于資源清理、文件關(guān)閉、解鎖以及記錄時(shí)間等操作
    • 通過與匿名函數(shù)配合可在return之后修改函數(shù)計(jì)算結(jié)果
    • 如果函數(shù)體內(nèi)某個(gè)變量作為defer時(shí)匿名函數(shù)的參數(shù),則在定義defer時(shí)即已經(jīng)獲得了拷貝,否則則是引用某個(gè)變量的地址

    • GO沒有異常機(jī)制,但有panic/recove模式來處理錯(cuò)誤
    • Panic可以在任何地方引發(fā),但recover只有在defer調(diào)用的函數(shù)中有效

    package mainimport ("fmt" )func main() {fmt.Println("A")defer fmt.Println("B")defer fmt.Println("C") } //PS:打印的結(jié)果就是A C B package mainimport ("fmt" )func main() {for i := 0; i < 3; i++ {//defer fmt.Println(i)defer func() {fmt.Println(i)}() //調(diào)用這個(gè)函數(shù)} }//剛才直接打印的時(shí)候,是作為一個(gè)參數(shù)傳遞進(jìn)去,運(yùn)行到defer的時(shí)候是將這個(gè)i的值進(jìn)行了一個(gè)拷貝,所以打印的是 2 1 0 //這種情況下i一直是一個(gè)地址的引用,i一直引用的是局部變量的i,在退出這個(gè)循環(huán)體的時(shí)候 i已經(jīng)變成了3,在main函數(shù)return的時(shí)候,開始執(zhí)行defer語句,defer語句的時(shí)候i已經(jīng)變成了3

    異常機(jī)制

    package mainimport ("fmt" )func main() {A()B()C()}func A() {fmt.Println("Func A") } func B() {defer func() {if err := recover(); err != nil {fmt.Println("Recover in B")}}()panic("Panic in B")} func C() {fmt.Println("Func C") } package mainimport ("fmt" )func main() {var fs = [4]func(){}for i := 0; i < 4; i++ {defer fmt.Println("defer i=", i) //這個(gè)i是傳遞進(jìn)來的參數(shù),所以是值得拷貝defer func() {fmt.Println("defer_closure i=", i) //這里的i是引用外部的i,所以循環(huán)結(jié)束后,i變成了4}()fs[i] = func() {fmt.Println("closure i = ", i) //這里也是引用外部的i,所以循環(huán)結(jié)束后i變成了4}}for _, f := range fs {f()} }

    轉(zhuǎn)載于:https://www.cnblogs.com/skymyyang/p/7659775.html

    總結(jié)

    以上是生活随笔為你收集整理的Golang 函数function的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。