網站首頁 編程語言 正文
前言
今天繼續為大家更新Go語言學習記錄的文章。
函數是任何一門編程語言最重要的組成部分之一。函數簡單理解是一段代碼的封裝:把一段邏輯抽象出來封裝到一個函數中,給他取個名字,每次需要的時候調用這個函數即可。使用函數能夠讓代碼更清晰,更簡潔。
定義
下面的代碼段介紹了go語言中函數定義的各種情況,以及延遲函數的使用。
package main import "fmt" // 函數的定義 func f1(x int, y int) (ret int) { return x + y } // 無返回值的函數 func f2(x int, y int) { fmt.Println(x + y) } // 沒有參數也沒有返回值的 func f3() { fmt.Println("1111") } // 沒有參數 有返回值的 func f4() int { return 4 } // 返回值可以命名也可以不命名 // 命名的返回值就相當于在函數中聲明一個變量 func f5(x int, y int) (ret int) { ret = x + y //注意:因為已經在返回值中聲明了ret,所以這里用= 而不是:= ,避免重復聲明問題 return //因為已經在函數體中聲明了ret,所以在return的時候不需要重復聲明 } // 多個返回值 func f6() (int, int) { return 1, 2 } // 多個參數簡寫的方式 // 當參數的類型一致時,可以將連續的相同參數 前面參數的類型省略 比如: func f7(x, y, z int, a, b string, c, d bool) int { return x + y + z } // 可變長參數 // 可變長參數必須放在函數參數的最后 func f8(x string, y ...int) { fmt.Println(x) fmt.Println(y) } // defer 延遲執行 func deferDemo() { defer fmt.Println("111") //最先defer的語句最后執行 defer fmt.Println("222") fmt.Println("333") } // go語言中函數沒有默認參數的概念 func main() { r := f5(1, 2) fmt.Println(r) m, n := f6() fmt.Println(m, n) r7 := f7(1, 2, 3, "1", "1", true, false) fmt.Println(r7) f8("hah") //可變長度 不填也可以 f8("hah", 1, 2, 3, 4) //延遲函數測試 deferDemo() }
函數也可以作為函數的參數
舉個栗子:
package main import "fmt" // 函數也可以作為函數參數的類型 func f3(x func() int) { ret := x() fmt.Printf("f3打印ret的值:%v\n", ret) //2 fmt.Printf("f3打印ret的類型:%T\n", ret) //int } func main() { a := f2 fmt.Printf("a的類型:%T\n", a) f3(a) }
打印結果:
函數作為函數的返回值
package main import "fmt" func f2() int { return 2 } func ff(x, y int) int { return x + y } // 函數不僅可以作為參數,還可以作為返回值 func f5(x func() int) func(int, int) int { return ff } func main() { f7 := f5(f2) fmt.Printf("f7的值:%v\n",f7) //f7返回的是一個函數 fmt.Printf("f7的類型:%T\n", f7) }
打印結果:
小結:
- 我們打印f7的值是一個內存地址
- f7的類型和我們預期的一致,返回了函數類型,就是我們定義的ff()函數
匿名函數
匿名函數就是沒有名字的函數。匿名函數多用于實現回調函數和閉包。
在Go語言中函數內部不能再像之前那樣定義函數了,只能定義匿名函數。
匿名函數的定義格式如下:
func(參數)(返回值){ 函數體 }
匿名函數因為沒有函數名,所以沒辦法像普通函數那樣調用,所以匿名函數需要保存到某個變量或者作為立即執行函數:
func main() { // 將匿名函數保存到變量 add := func(x, y int) { fmt.Println(x + y) } add(10, 20) // 通過變量調用匿名函數 //自執行函數:匿名函數定義完加()直接執行 func(x, y int) { fmt.Println(x + y) }(10, 20) }
小結:自執行函數就是在匿名函數后面追加(),表示不需要外部調用,直接執行。
閉包
閉包是一個函數,這個函數包含了他外部作用域的一個變量
舉個栗子
package main import "fmt" func adder(x int) func(int) int { return func(y int) int { x += y return x } } func main() { f1 := adder(1) ret := f1(2) fmt.Println(ret) }
打印結果:
小結: 上面的栗子就是一個典型的閉包結構:匿名函數內部包含了他外部的變量x。
閉包=函數+引用環境
總結
原文鏈接:https://juejin.cn/post/7073279289101123614
相關推薦
- 2023-05-06 React組件渲染后對DOM的操作方式_React
- 2022-08-07 Go?gRPC教程實現Simple?RPC_Golang
- 2023-08-01 React之組件的分類、使用,事件對象,this指向問題,修改狀態以及受控組件與非受控組件
- 2022-05-16 深入理解docker鏡像的分層(小白必看)_docker
- 2022-04-01 LC_CTYPE: cannot change locale (en_US.UTF-8): No s
- 2022-07-08 docker部署釘釘機器人報警通知的實現_docker
- 2022-07-19 react組件通訊的基本使用props
- 2022-05-06 C語言結構體使用之鏈表_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支