go語言學習 第5章:函數

第5章:函數

函數是編程中不可或缺的一部分,它封裝了一段可重復使用的代碼,用于執行特定的任務。在Go語言中,函數同樣扮演著重要的角色。本章將詳細介紹Go語言中函數的定義、調用、參數傳遞、返回值處理以及一些高級特性,如閉包和匿名函數。

一、函數的定義與調用

(一)函數的定義

在Go語言中,函數的定義使用func關鍵字。基本語法如下:

func 函數名(參數列表) 返回值列表 {// 函數體
}
  • 函數名:函數的名稱,用于調用函數。
  • 參數列表:函數接收的輸入參數,可以有多個參數,也可以沒有參數。
  • 返回值列表:函數執行完成后返回的值,可以有多個返回值,也可以沒有返回值。
  • 函數體:函數的具體實現代碼。
1. 無參數無返回值的函數
package mainimport "fmt"func sayHello() {fmt.Println("Hello, Golang!")
}func main() {sayHello() // 調用函數
}
2. 帶參數的函數
package mainimport "fmt"func add(a, b int) int {return a + b
}func main() {result := add(10, 20)fmt.Println("結果是:", result)
}
3. 多返回值的函數

Go語言支持函數返回多個值。例如:

package mainimport "fmt"func swap(a, b int) (int, int) {return b, a
}func main() {x, y := swap(10, 20)fmt.Println("交換后的值:", x, y)
}

(二)函數的調用

函數的調用非常簡單,只需要使用函數名并傳遞相應的參數即可。例如:

package mainimport "fmt"func main() {sayHello() // 調用無參數函數result := add(10, 20) // 調用帶參數函數fmt.Println("結果是:", result)x, y := swap(10, 20) // 調用多返回值函數fmt.Println("交換后的值:", x, y)
}

二、參數傳遞

(一)值傳遞

在值傳遞中,函數接收的是參數的副本,對參數的修改不會影響原始變量。例如:

package mainimport "fmt"func modifyValue(a int) {a = 100
}func main() {num := 10modifyValue(num)fmt.Println("修改后的值:", num) // 輸出 10
}

(二)指針傳遞

在指針傳遞中,函數接收的是參數的地址,對參數的修改會影響原始變量。例如:

package mainimport "fmt"func modifyValue(a *int) {*a = 100
}func main() {num := 10modifyValue(&num)fmt.Println("修改后的值:", num) // 輸出 100
}

三、函數的高級特性

(一)匿名函數

匿名函數是沒有名稱的函數,可以在定義時直接調用,也可以賦值給變量后調用。例如:

package mainimport "fmt"func main() {// 定義并直接調用匿名函數result := func(a, b int) int {return a + b}(10, 20)fmt.Println("結果是:", result)// 將匿名函數賦值給變量add := func(a, b int) int {return a + b}fmt.Println("結果是:", add(30, 40))
}

(二)閉包

閉包是一個函數和其相關的引用環境的組合。閉包可以捕獲外部變量,并在函數外部使用這些變量。例如:

package mainimport "fmt"func getCounter() func() int {var count intreturn func() int {count++return count}
}func main() {counter := getCounter()fmt.Println(counter()) // 輸出 1fmt.Println(counter()) // 輸出 2fmt.Println(counter()) // 輸出 3
}

(三)函數作為參數

在Go語言中,函數也是一種類型,可以作為參數傳遞給其他函數。例如:

package mainimport "fmt"func add(a, b int) int {return a + b
}func subtract(a, b int) int {return a - b
}func operate(a, b int, operation func(int, int) int) int {return operation(a, b)
}func main() {result := operate(10, 5, add)fmt.Println("加法結果:", result) // 輸出 15result = operate(10, 5, subtract)fmt.Println("減法結果:", result) // 輸出 5
}

(四)函數作為返回值

函數不僅可以作為參數傳遞,還可以作為返回值。例如:

package mainimport "fmt"func getOperation(op string) func(int, int) int {if op == "add" {return func(a, b int) int {return a + b}} else if op == "subtract" {return func(a, b int) int {return a - b}}return nil
}func main() {add := getOperation("add")fmt.Println("加法結果:", add(10, 5)) // 輸出 15subtract := getOperation("subtract")fmt.Println("減法結果:", subtract(10, 5)) // 輸出 5
}

四、函數的命名和文檔

(一)函數命名

函數的命名應該清晰地反映其功能。通常使用駝峰命名法,首字母小寫表示私有函數,首字母大寫表示公有函數。例如:

func add(a, b int) int {return a + b
}func Add(a, b int) int {return a + b
}

(二)函數文檔

在Go語言中,可以通過在函數定義前添加注釋來為函數編寫文檔。這些注釋會被go doc工具讀取并生成文檔。例如:

// Add returns the sum of a and b.
func Add(a, b int) int {return a + b
}

五、總結

本章詳細介紹了Go語言中函數的定義、調用、參數傳遞、返回值處理以及一些高級特性,如閉包和匿名函數。函數是Go語言中非常重要的一個概念,它不僅可以讓代碼更加模塊化,還可以通過高級特性實現一些復雜的邏輯。通過合理使用函數,可以使代碼更加清晰、易讀和易維護。

在接下來的章節中,我們將繼續深入學習Go語言的其他特性,如錯誤處理、數組、切片、映射等。希望讀者能夠通過這些內容更好地掌握Go語言,提升編程技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83617.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MapReduce 分布式計算模型

what:分解大數據集,并行處理,匯總結果(分解組合思想) 目的:SQL查詢轉換為MR,理解MR更好優化SQL 優點: 只需關注業務邏輯(自定義函數map,reduce&#xff09…

RDMA簡介3之四種子協議對比

RDMA協議共有四種子協議,分別為InfiniBand、iWARP、RoCE v1和RoCE v2協議。這四種協議使用統一的RDMA API,但在具體的網絡層級實現上有所不同,如圖1所示,接下來將分別介紹這四種子協議。 圖1 RDMA四種子協議網絡層級關系圖 Infin…

LabelImg: 開源圖像標注工具指南

LabelImg: 開源圖像標注工具指南 1. 簡介 LabelImg 是一個圖形化的圖像標注工具,使用 Python 和 Qt 開發。它是目標檢測任務中最常用的標注工具之一,支持 PASCAL VOC 和 YOLO 格式的標注輸出。該工具開源、免費,并且跨平臺支持 Windows、Lin…

系統架構設計論文

disstertation 軟考高級-系統架構設計師-論文:論文范圍(十大知識領域)、歷年論題、預測論題及論述過程、論文要點、論文模板等。 —— 2025 年 4 月 4 日 甲辰年三月初七 清明 目錄 disstertation1、論文范圍(十大核心領域&#x…

數學復習筆記 26

5.25:這題還是有點難度的。主要是出現了新的知識點,我現在還沒有那么熟悉這個新的知識點。這塊就是,假設一個矩陣可以寫成一個列向量乘以一個行向量的形式,這兩個向量都是非零向量,那么這個矩陣的秩等于一。這個的原理…

[Java 基礎]注釋

注釋在編程中扮演著非常重要的角色,它們是寫給人類閱讀的,而不是給計算機執行的。良好的注釋可以極大地提高代碼的可讀性和可維護性。 為什么需要注釋? 提高可讀性: 注釋可以解釋代碼的功能、實現思路、特殊處理等,幫…

TortoiseSVN賬號切換

SVN登錄配置及賬號切換 本文主要為了解答svn客戶端如何進行賬號登錄及切換不同權限賬號的方式。 一、環境準備與客戶端安裝 安裝TortoiseSVN客戶端 ??下載地址??:TortoiseSVN官網 ??安裝步驟??: 雙擊安裝包,按向導完成安裝后&#x…

5分鐘了解JVM運行時數據區域

點擊藍字,關注我們 在 Java 程序運行期間,JVM 會劃分出幾塊重要的內存區域,用來支撐類加載、方法調用、對象分配、線程執行等一切運行時行為。 這些區域構成了 JVM 的“運行時數據區”。 一、運行時數據區域概覽圖 二、Java 堆(H…

深入理解CSS浮動:從基礎原理到實際應用

深入理解CSS浮動:從基礎原理到實際應用 引言 在網頁設計中,CSS浮動(float)是一個歷史悠久卻又至關重要的概念。雖然現代布局技術如Flexbox和Grid逐漸流行,但浮動仍然在許多場景中發揮著重要作用。本文將帶你深入理解…

Spring Bean 為何“難產”?攻克構造器注入的依賴與歧義

本文已收錄在Github,關注我,緊跟本系列專欄文章,咱們下篇再續! 🚀 魔都架構師 | 全網30W技術追隨者🔧 大廠分布式系統/數據中臺實戰專家🏆 主導交易系統百萬級流量調優 & 車聯網平臺架構&a…

華為云Flexus+DeepSeek征文|實戰體驗云服務器單機部署和CCE高可用的架構AI賦能

前引:“在數字化浪潮洶涌澎湃的今天,企業對云計算服務的需求已從基礎架構支撐,逐步轉向更深層次的AI賦能與業務創新驅動。面對復雜多變的市場環境,選擇一個強大、可靠且具備前瞻性的云服務伙伴,無疑是企業實現高速增長…

雷卯針對易百納G610Q-IPC-38E 模組防雷防靜電方案

一、應用場景 1、智能監控 2、智能家居 3、工業自動化 4、機器人 5、智能交通 6、醫療影像 7、教育科研 二、 功能概述 1 HI3516CV610(ARM Cortex-A7 MP2) 2 AI算力 1Tops 3 模組集成 4M30FPS Sensor,支持最高 6M30fps 的 ISP 圖像…

生成對抗網絡(GAN)基礎原理深度解析:從直觀理解到形式化表達

摘要 本文詳細解析 生成對抗網絡(GAN) 的 核心原理,從通俗類比入手,結合印假鈔與警察博弈的案例闡述生成器 與 判別器 的對抗機制;通過模型結構示意圖,解析 噪聲采樣、樣本生成 及判別流程;基于…

OptiStruct結構分析與工程應用:無限元法介紹

13.3 無限元方法 本節將詳細闡述如何利用無限元方法求解外聲場分析,具體包括無限元方法基本理論,無限單元介紹、無限元分析建模指南及檢查,最后以一個實例講解整個分析設置過程。 13.3.1 無限元分析基礎理論 無限元求解外聲場的基本原理如…

判斷:有那種使用了局部變量的遞歸過程在轉換成非遞歸過程時才必須使用棧

這道題的關鍵在于理解遞歸轉非遞歸與 “是否用棧” 的本質邏輯,和 “局部變量” 無關,核心看遞歸的調用上下文是否需要保存。 一、遞歸的本質:依賴 “調用棧” 遞歸函數執行時,系統會用調用棧保存: 每層遞歸的參數、…

leetcode1443. 收集樹上所有蘋果的最少時間-medium

1 題目:收集樹上所有蘋果的最少時間 官方標定難度:中 給你一棵有 n 個節點的無向樹,節點編號為 0 到 n-1 ,它們中有一些節點有蘋果。通過樹上的一條邊,需要花費 1 秒鐘。你從 節點 0 出發,請你返回最少需…

MySQL 索引底層原理剖析:B+ 樹結構、索引創建維護與性能優化策略全解讀

引言 在 MySQL 數據庫的世界里,索引是提升查詢性能的關鍵利器。然而,很多開發者雖然知道索引的重要性,但對于索引背后的底層原理卻知之甚少。本文將深入 MySQL 索引的底層實現,剖析 B 樹的結構特點,以及如何利用這些知…

【Delphi】實現在多顯示器時指定程序運行在某個顯示器上

在多顯示器時代,經常會出現期望將程序運行在某個指定的顯示器上,特別是在調試程序的時候,期望切換分辨率,單步調試時,此時容易導致互相卡住,非常不方便,但是通過指定程序運行在不同的顯示器上就…

不動產登記區塊鏈系統(Vue3 + Go + Gin + Hyperledger Fabric)

好久沒有介紹過新項目的制作了,之前做的一直都是Fisco Bcos的項目,沒有介紹過Hyperledger Fabric的項目,這次來給大家分享下。 系統概述 不動產登記與交易平臺是一個基于Hyperledger Fabric的綜合性管理系統,旨在實現不動產登記…

論文閱讀筆記——Large Language Models Are Zero-Shot Fuzzers

TitanFuzz 論文 深度學習庫(TensorFlow 和 Pytorch)中的 bug 對下游任務系統是重要的,保障安全性和有效性。在深度學習(DL)庫的模糊測試領域,直接生成滿足輸入語言(例如 Python )語法/語義和張量計算的DL A…