GO——學習筆記(四)

上篇:GO——學習筆記(三)

下篇:GO——學習筆記(五)

參考:

https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.3.md

示例代碼——go_3

https://github.com/jiutianbian/golang-learning/blob/master/go_3/main.go

一、函數(shù)

函數(shù)定義

    func sayHello(name string, age int) (sayName string, sayAge string, askYou string) {
        sayName = "我叫" + name                        //由于返回值中已經(jīng)定義了sayName的變量,所以不需要再定義,可以直接賦值
        sayAge = "今年" + fmt.Sprintf("%d", age) + "歲" //將int類型通過Sprintf方法轉為字符串
        askYou = "你呢?"

        return sayName, sayAge, askYou
    }
  • 函數(shù)用 func 關鍵字來聲明
  • sayHello 為函數(shù)名,區(qū)分大小寫,大寫開頭為公有方法,小寫開頭為私有,具體使用詳情后面介紹
  • name和age為函數(shù)入?yún)?,可以沒有,或者單個,或者多個。
  • sayName,sayAge和askYou為函數(shù)出參(返回值),可以沒有,或者單個或者多個返回值,這個要著重說一下,java和C最多只能有單個返回值,不存在多個返回值的情況,此屬于golang函數(shù)的特性

函數(shù)多返回值

具體,可以上面的例子,就是一個多返回值的示例

變參

func saySomeThing(something ...string) {//變參是指不定數(shù)量的參數(shù),用...和具體的參數(shù)類型表示
    for index, value := range something {
        fmt.Println("index:", index)
        fmt.Println("value:", value)
    }
}

傳指針作為入?yún)?/h4>
func main() {
    name := "湯姆"

    //如果我們只是傳入值,不傳指針,那么只相當于對name的copy做操作,實際的name值不會變更,還是會輸出湯姆
    sayHelloByName := sayHelloByName(name)
    fmt.Println("name:" + name) //輸出 name:湯姆

    //如果我們傳指針,那么只相當于對name本身做操作,實際的name值會變更,會輸出為湯姆漢克斯
    sayHelloByName := sayHelloByNameZhiZhen(&name)
    fmt.Println("namebyzhizhen:" + name) //輸出 namebyzhizhen:湯姆漢克斯

    fmt.Println("sayHelloByName:" + sayHelloByName_1)      //輸出 sayHelloByName:湯姆漢克斯
    fmt.Println("sayHelloByNameZhiZhen:" + sayHelloByName) //輸出 sayHelloByNameZhiZhen:你好湯姆漢克斯
}

func sayHelloByName(name string) (sayHelloByName string) {
    name = name + "漢克斯"
    return "你好" + name
}

func sayHelloByNameZhiZhen(name *string) (sayHelloByName string) {
    *name = *name + "漢克斯"
    return "你好" + *name
}
  • 傳指能夠讓函數(shù)操作同一對象
  • Go語言中channel,slice,map這三種類型的實現(xiàn)機制類似指針,所以可以直接傳遞,而不用取地址后傳遞指針。(注:若函數(shù)需改變slice的長度,則仍需要取地址傳遞指針)

傳函數(shù)作為入?yún)?/h4>
func main() {
    //通過傳入同種輸入輸出格式,但不同的函數(shù),來獲得不同的函數(shù)輸出
    fmt.Println(getMyView("小明", sayHate))    //輸出 我恨小明
    fmt.Println(getMyView("湯姆漢克斯", sayLove)) //輸出 我喜歡湯姆漢克斯
}

type sayLoveOrHate func(string) string // 聲明了一個函數(shù)類型為sayLoveOrHate,用來表示一個輸入?yún)?shù)和一個輸出參數(shù)的函數(shù)

func getMyView(name string, say sayLoveOrHate) (view string) { //聲明了一個函數(shù)getMyview,傳入了sayLoveOrHate的函數(shù)類型作為輸入?yún)?shù)
    return say(name)
}

func sayLove(name string) (sayLove string) {
    return "我喜歡" + name
}

func sayHate(name string) (sayLove string) {
    return "我恨" + name
}

二、 golang的異常機制 Panic和Recover

    defer func() { // 必須要先聲明defer,否則不能捕獲到panic異常
        if err := recover(); err != nil {
            fmt.Println(err) // 這里的err其實就是panic傳入的內(nèi)容,55
        }
    }()

    panic("我死掉了") //主動拋出 panic
  • Go沒有像Java那樣的異常機制,它不能拋出異常,而是使用了panic和recover機制。
  • 建議少用,有可能會引起性能問題
  • panic用來拋出異常,defer 中的函數(shù)塊用來捕獲異常,并執(zhí)行處理操作-
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容