上篇:GO——學(xué)習(xí)筆記(三)
下篇:GO——學(xué)習(xí)筆記(五)
參考:
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類型通過(guò)Sprintf方法轉(zhuǎn)為字符串
askYou = "你呢捕透?"
return sayName, sayAge, askYou
}
- 函數(shù)用 func 關(guān)鍵字來(lái)聲明
- sayHello 為函數(shù)名,區(qū)分大小寫,大寫開頭為公有方法咳燕,小寫開頭為私有,具體使用詳情后面介紹
- name和age為函數(shù)入?yún)⒄忻ぃ梢詻](méi)有,或者單個(gè)嘉冒,或者多個(gè)。
- sayName讳推,sayAge和askYou為函數(shù)出參(返回值),可以沒(méi)有银觅,或者單個(gè)或者多個(gè)返回值礼饱,這個(gè)要著重說(shuō)一下究驴,java和C最多只能有單個(gè)返回值镊绪,不存在多個(gè)返回值的情況洒忧,此屬于golang函數(shù)的特性
函數(shù)多返回值
具體,可以上面的例子熙侍,就是一個(gè)多返回值的示例
變參
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 := "湯姆"
//如果我們只是傳入值蛉抓,不傳指針庆尘,那么只相當(dāng)于對(duì)name的copy做操作巷送,實(shí)際的name值不會(huì)變更驶忌,還是會(huì)輸出湯姆
sayHelloByName := sayHelloByName(name)
fmt.Println("name:" + name) //輸出 name:湯姆
//如果我們傳指針惩系,那么只相當(dāng)于對(duì)name本身做操作,實(shí)際的name值會(huì)變更堡牡,會(huì)輸出為湯姆漢克斯
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ù)操作同一對(duì)象
- Go語(yǔ)言中channel抒抬,slice晤柄,map這三種類型的實(shí)現(xiàn)機(jī)制類似指針擦剑,所以可以直接傳遞,而不用取地址后傳遞指針惠勒。(注:若函數(shù)需改變slice的長(zhǎng)度,則仍需要取地址傳遞指針)
傳函數(shù)作為入?yún)?/h4>
func main() {
//通過(guò)傳入同種輸入輸出格式纠屋,但不同的函數(shù),來(lái)獲得不同的函數(shù)輸出
fmt.Println(getMyView("小明", sayHate)) //輸出 我恨小明
fmt.Println(getMyView("湯姆漢克斯", sayLove)) //輸出 我喜歡湯姆漢克斯
}
type sayLoveOrHate func(string) string // 聲明了一個(gè)函數(shù)類型為sayLoveOrHate售担,用來(lái)表示一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的函數(shù)
func getMyView(name string, say sayLoveOrHate) (view string) { //聲明了一個(gè)函數(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的異常機(jī)制 Panic和Recover
defer func() { // 必須要先聲明defer恭朗,否則不能捕獲到panic異常
if err := recover(); err != nil {
fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容哥攘,55
}
}()
panic("我死掉了") //主動(dòng)拋出 panic
- Go沒(méi)有像Java那樣的異常機(jī)制剖煌,它不能拋出異常逝淹,而是使用了panic和recover機(jī)制耕姊。
- 建議少用创橄,有可能會(huì)引起性能問(wèn)題
- panic用來(lái)拋出異常箩做,defer 中的函數(shù)塊用來(lái)捕獲異常妥畏,并執(zhí)行處理操作-
func main() {
name := "湯姆"
//如果我們只是傳入值蛉抓,不傳指針庆尘,那么只相當(dāng)于對(duì)name的copy做操作巷送,實(shí)際的name值不會(huì)變更驶忌,還是會(huì)輸出湯姆
sayHelloByName := sayHelloByName(name)
fmt.Println("name:" + name) //輸出 name:湯姆
//如果我們傳指針惩系,那么只相當(dāng)于對(duì)name本身做操作,實(shí)際的name值會(huì)變更堡牡,會(huì)輸出為湯姆漢克斯
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() {
//通過(guò)傳入同種輸入輸出格式纠屋,但不同的函數(shù),來(lái)獲得不同的函數(shù)輸出
fmt.Println(getMyView("小明", sayHate)) //輸出 我恨小明
fmt.Println(getMyView("湯姆漢克斯", sayLove)) //輸出 我喜歡湯姆漢克斯
}
type sayLoveOrHate func(string) string // 聲明了一個(gè)函數(shù)類型為sayLoveOrHate售担,用來(lái)表示一個(gè)輸入?yún)?shù)和一個(gè)輸出參數(shù)的函數(shù)
func getMyView(name string, say sayLoveOrHate) (view string) { //聲明了一個(gè)函數(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的異常機(jī)制 Panic和Recover
defer func() { // 必須要先聲明defer恭朗,否則不能捕獲到panic異常
if err := recover(); err != nil {
fmt.Println(err) // 這里的err其實(shí)就是panic傳入的內(nèi)容哥攘,55
}
}()
panic("我死掉了") //主動(dòng)拋出 panic
- Go沒(méi)有像Java那樣的異常機(jī)制剖煌,它不能拋出異常逝淹,而是使用了panic和recover機(jī)制耕姊。
- 建議少用创橄,有可能會(huì)引起性能問(wèn)題
- panic用來(lái)拋出異常箩做,defer 中的函數(shù)塊用來(lái)捕獲異常妥畏,并執(zhí)行處理操作-