上篇: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í)行處理操作-
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
}
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í)行處理操作-