成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你了解Go語言基礎之函數(中篇)

開發 后端
通常來說,defer會用在釋放數據庫連接,關閉文件等需要在函數結束時處理的操作。

[[433020]]

前言

Hey,大家好呀,我是星期八,上篇文章學了些基礎:一篇文章帶你了解Go語言基礎之函數(上篇),這次咱們繼續學習Go基礎之函數進階叭。

Go函數內存分配圖

Go的函數內存分配,有點像堆分配,有點像,但是本質不是。

可以理解像堆內存一樣,棧中保存的是堆的地址。

驗證

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5.  
  6. func say() string { 
  7.     return "ok" 
  8.  
  9. func main() { 
  10.     fmt.Printf("say棧上的內容:%p\n",say) 

結果

本質

函數的作用域

作用域這個問題,以前可能或多或少提過,再來復習一下叭。

全局變量

全局變量就是在所有函數外部定義的變量,程序不結束,變量就一直存在。

當然,任何函數都可以訪問全局變量。

注:全局變量盡量全部用大寫。

小試牛刀

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5.  
  6. var NAME = "張三" 
  7. func say() string { 
  8.     fmt.Println(NAME
  9.     return "ok" 
  10.  
  11. func main() { 
  12.     say() 
  13.     fmt.Println(NAME

結果:

上述可能會有個問題,全局變量,全局變量,大家共用一個,要是誰傻不拉幾修改了不就完蛋了,整個程序都涼了。

var引發的問題

就像這樣。

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. var NAME = "張三" 
  6.  
  7. func say() string { 
  8.     fmt.Println(NAME
  9.     NAME = "李四" 
  10.     return "ok" 
  11.  
  12. func main() { 
  13.     say() 
  14.     fmt.Println(NAME

結果:

這不就完犢子了嗎???所以,一定要有解決辦法。

使用const解決問題

解決辦法:使用常量定義全局變量。

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. const NAME = "張三" 
  6.  
  7. func say() string { 
  8.     fmt.Println(NAME
  9.     //NAME = "李四"//會報錯:cannot assign to NAME 
  10.     return "ok" 
  11.  
  12. func main() { 
  13.     say() 
  14.     fmt.Println(NAME
  15.  

總結

在定義全局變量時,需要用const修飾,并且變量名全部大寫。

局部變量

局部變量,局部變量就是在某個函數內定義的變量,只能在自己函數內使用。

更專業點,在{}內定義的,只能在{}內使用,for同理。

代碼

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.  
  6. func say() string { 
  7.     var name = "張三" 
  8.     fmt.Println(name
  9.     return "ok" 
  10.  
  11. func main() { 
  12.     say() 
  13.     //fmt.Println(name)//會報錯:undefined: name 
  14.     //for同理 
  15.     for i := 0; i <= 1; i++ { 
  16.         var c = "66" 
  17.         fmt.Println(c) //66 
  18.     //fmt.Println(c)//會報錯:undefined: c 

defer

在Go中,defer語句,可以理解為在return之前執行的一個語句。

如果函數沒有return,會有一個默認的return,只是看不見而已。

一個defer

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say() { 
  6.     //defer盡量往前放 
  7.     defer fmt.Println("我是666"
  8.     fmt.Println("你們都是最棒的"
  9.  
  10. func main() { 
  11.     say() 

執行結果

多個defer

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say() { 
  6.     //defer盡量往前放 
  7.     defer fmt.Println(1) 
  8.     defer fmt.Println(2) 
  9.     defer fmt.Println(3) 
  10.     fmt.Println("你們都是最棒的"
  11.  
  12. func main() { 
  13.     say() 

執行結果

可以發現,defer的執行結果是反著的。

結論:最先執行的defer,會最后執行,最后執行的defer,會最先執行,有點像棧,先進后出。

defer的作用

通常來說,defer會用在釋放數據庫連接,關閉文件等需要在函數結束時處理的操作。

這里暫時先不舉例子。

panic和recover

這倆,可以理解為Python中的try和raise,因為在Go中,是沒有try的,是不能像其他語言一樣,try所有異常。

應用場景:比如某個web,在啟動時,數據庫都沒連接成功,必定要啟動失敗,就像電腦,沒有電源必不能開機一樣。

panic

先看一下語法吧

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say() { 
  6.     var flag = true 
  7.     if flag{ 
  8.         //引發錯誤,直接中斷程序的錯誤 
  9.         panic("OMG,撤了撤了,必須撤了"
  10.  
  11. func main() { 
  12.     say() 
  13.     fmt.Println("繼續呀...")//不會執行,程序掛了 

執行效果

可以看淡,繼續呀就沒打印,程序直接掛了,但是上述好像并沒有解決這個問題。

recover

嘗試捕捉

代碼

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func say() { 
  6.   //匿名函數,defer執行的是一個匿名函數 
  7.   defer func() { 
  8.     var err = recover() 
  9.     //如果有panic錯誤,err!=nil,在此處步驟,嘗試恢復 
  10.     if err != nil { 
  11.       fmt.Println("嘗試恢復..."
  12.     } 
  13.   }() 
  14.   var flag = true 
  15.   if flag { 
  16.     panic("OMG,撤了撤了,必須撤了"
  17.   } 
  18.  
  19. func main() { 
  20.   say() 
  21.   fmt.Println("繼續呀..."

執行結果

可以看到,如果recover捕捉了,并且沒有panic,程序就會繼續正常執行。

注意

defer必須在panic語句之前。

recover必須配合defer使用。

總結

上述我們學習了Go基礎之函數進階。如果在操作過程中有任何問題,記得下面討論區留言,我們看到會第一時間解決問題。

本文轉載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉載本文請聯系Go語言進階學習公眾號。

 

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2021-10-30 10:43:04

語言Go函數

2020-10-25 07:33:13

Go語言

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2022-02-16 10:03:06

對象接口代碼

2020-11-05 09:58:16

Go語言Map

2020-12-07 05:59:02

語言Go接口

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-12-09 09:59:32

Go語言技術

2020-12-27 10:15:44

Go語言channel管道

2020-12-30 09:04:32

Go語言TCPUDP

2020-10-22 11:15:47

Go語言變量

2021-09-29 10:00:07

Go語言基礎

2021-10-13 10:00:52

Go語言基礎

2021-10-16 10:17:51

Go語言數據類型

2020-12-23 08:39:11

Go語言基礎技術

2021-01-13 08:40:04

Go語言文件操作

2021-02-20 10:06:14

語言文件操作
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区高清 | 在线视频 亚洲 | 欧美视频xxx | 日韩精品在线免费观看视频 | 成人一区在线观看 | 中文字幕在线观看视频一区 | 欧美在线视频免费 | 久久久久亚洲精品中文字幕 | 午夜免费在线观看 | 成人亚洲精品 | 亚洲综合成人网 | 亚洲国产激情 | 日本三级精品 | 日本三级日产三级国产三级 | 成人片免费看 | 免费看a | 综合色在线 | 亚洲一区二区三区在线免费 | 久久久无码精品亚洲日韩按摩 | 97久久久久久 | 综合久久av | 日本高清aⅴ毛片免费 | 最新91在线 | 91成人| 久久久精品网 | 日屁网站 | 欧美日本免费 | 国产一区在线免费观看 | 国产1区| 56pao在线| 色狠狠一区 | 日本在线免费看最新的电影 | 久久九精品 | 日本aⅴ中文字幕 | 国产真实乱全部视频 | 国产精品成av人在线视午夜片 | 久久精品国产亚洲a | 99精品久久久久久中文字幕 | 久久69精品久久久久久久电影好 | 国产精品精品视频 | 国产精品7777777 |