Go語言--語法基礎7--函數定義與調用--自定義函數

函數是基本的代碼塊,用于執行一個任務。Go 語言最少有 1 個?main()?函數。你可以通過函數來劃分不同功能,邏輯上每個函數執行的是指定的任務。

函數聲明告訴了編譯器函數的名稱、返回類型和參數。

函數三要素

  1. 名稱 ==》功能
  2. 參數 ==》接口
  3. 返回值 ==》結果

函數分類

  1. 內置函數 ==》不需要引用其他模塊,直接使用,例如:len()
  2. 標準庫函數 ==》需要引用第三方模塊或其他模塊,帶名稱使用,例如:fmt.Println()
  3. 自定義函數 ==》程序員自行編寫,自己調用

1、函數定義

Go 語言函數定義格式如下:

func function_name ( [parameter list] ) [return_types] {函數體
}

示例

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

函數定義解析

  • func:函數由?func?開始聲明
  • function_name:函數名稱,函數名和參數列表一起構成了函數簽名。注意:首字母大寫表示公開函數,首字母小寫是私有函數。
  • parameter list:參數列表,參數就像一個占位符,當函數被調用時,你可以將值傳遞給參數,這個值被稱為實際參數。參數列表指定的是參數類型、順序及參數個數。參數是可選的,也就是說函數也可以不包含參數。
  • return_types:返回類型,函數返回一列值。return_types?是該列值的數據類型。有些功能不需要返回值,這種情況下?return_types?不是必須的。
  • 函數體:函數定義的代碼集合。

實例

以下實例為?max()?函數的代碼,該函數傳入兩個整型參數?num1?和?num2,并返回這兩個參數的最大值:

/* 函數返回兩個數的最大值 */
func max (num1, num2 int) int {/* 聲明局部變量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

2、函數調用

當創建函數時,你定義了函數需要做什么,通過調用該函數來執行指定任務。調用函數,向函數傳遞參數,并返回值,例如:

package main
import "fmt"func main() {/* 定義局部變量 */var a int = 100var b int = 200var ret int/* 調用函數并返回最大值 */ret = max(a, b) // a, b 實參fmt.Printf( "最大值是 : %d\n", ret )
}/* 函數返回兩個數的最大值 */
// num1,num2 是形參
func max(num1, num2 int) int {/* 定義局部變量 */var result intif (num1 > num2) {result = num1} else {result = num2}return result 
}

以上實例在?main()?函數中調用?max()?函數,執行結果為:

最大值是 : 200

3、函數參數

函數如果使用參數,該變量可稱為函數的形參。形參就像定義在函數體內的局部變量。

調用函數,可以通過兩種方式來傳遞參數:

值傳遞

傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣在函數中如果對參數進行修改,將不會影響到實際參數。

默認情況下,Go 語言使用的是值傳遞,即在調用過程中不會影響到實際參數。

接下來,讓我們使用值傳遞來調用?swap()?函數:

package main
import "fmt"func main() {/* 定義局部變量 */var a int = 100var b int = 200fmt.Printf("交換前 a 的值為 : %d\n", a )fmt.Printf("交換前 b 的值為 : %d\n", b )/* 通過調用函數來交換值 */swap(a, b) // 值傳遞,a ==》x,b ==》yfmt.Printf("交換后 a 的值 : %d\n", a )fmt.Printf("交換后 b 的值 : %d\n", b )
}/* 定義相互交換值的函數 */
func swap(x, y int) int {var temp inttemp = x /* 保存 x 的值 */x = y    /* 將 y 值賦給 x */y = temp /* 將 temp 值賦給 y*/return temp;
}

程序中使用的是值傳遞,所以兩個值并沒有實現交互,我們可以使用引用傳遞來實現交換效果。

引用傳遞

引用傳遞是指在調用函數時將實際參數的地址傳遞到函數中,那么在函數中對參數所進行的修改,將影響到實際參數。

引用傳遞指針參數傳遞到函數內,以下是交換函數?swap()?使用了引用傳遞:

以下我們通過使用引用傳遞來調用?swap()?函數:

package main
import "fmt"func main() {/* 定義局部變量 */var a int = 100var b int = 200fmt.Printf("交換前,a 的值 : %d\n", a )fmt.Printf("交換前,b 的值 : %d\n", b )/* 調用 swap() 函數* &a 指向 a 指針,a 變量的地址* &b 指向 b 指針,b 變量的地址*/swap(&a, &b) // 引用傳遞,&a ===》x,&b ===》yfmt.Printf("交換后,a 的值 : %d\n", a )fmt.Printf("交換后,b 的值 : %d\n", b )
}func swap(x *int, y *int) {var temp inttemp = *x /* 保存 x 地址上的值 */*x = *y   /* 將 y 值賦給 x */*y = temp /* 將 temp 值賦給 y */
}

4、函數返回多個值

Go 函數可以返回多個值,例如:

package main
import "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {a, b := swap("Mahesh", "Kumar")fmt.Println(a, b)
}

以上實例執行結果為:

Kumar Mahesh

5、defer 語句

Go 語言中的?defer?語句會將其后面跟隨的語句進行延遲處理。在?defer?所屬的函數即將返回時,將延遲處理的語句按照?defer?定義的順序逆序執行,即先進后出。

package main
import "fmt"func main() {fmt.Println("開始")defer fmt.Println(1)defer fmt.Println(2)defer fmt.Println(3)fmt.Println("結束")
}

以上代碼執行結果如下:

開始
結束
3
2
1

6、init 函數

每一個源文件都可以包含一個?init?函數,該函數會在?main?函數執行前,被 Go 框架調用,也就是說?init()?函數會在?main()?函數之前執行。

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

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

相關文章

Ollama模型庫模型下載慢完美解決(全平臺)

前言在我們從ollama下載模型時,會發現ollama最開始下載速度很快,能達到10-20MB/s但到了后期,速度就會越來越慢,最終降低到10-20kb/s下載一個模型大多需要1到1.5小時這是因為ollama服務器負荷過大的問題思路如果在下載中終斷下載,在用ollama run恢復下載,速度就會又提上去,但3-4…

web:js的模塊導出/導入

一般web頁面中&#xff0c;html文件通過標簽script引用js文件。但是js文件之間的引用要通過import/exprot進行導入/導出&#xff0c;同時還要在html文件中對js文件的引用使用type屬性標注。在下面的例子中&#xff0c;html頁面<!DOCTYPE html> <html lang"en&quo…

關于Web前端安全防御之安全頭配置

一、核心安全頭的作用 1. X-Content-Type-Options: nosniff 該響應頭用于阻止瀏覽器對資源的 MIME 類型進行 “嗅探”&#xff08;猜測&#xff09;&#xff0c;強制瀏覽器嚴格遵守服務器返回的 Content-Type 頭部聲明。 風險背景&#xff1a; 瀏覽器默認會對未明確聲明類型…

C++ : 反向迭代器的模擬實現

一、reverse_iterator.h#pragma once namespace txf { //外界傳什么類型的iteator&#xff0c;它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在這個反向迭代器中涉及到…

自動化與配置管理工具 ——SaltStack

一、SaltStack 概述1.1 核心特性SaltStack 是一款開源的自動化運維工具&#xff0c;采用客戶端 - 服務器&#xff08;C/S&#xff09;架構&#xff0c;以高效、靈活和可擴展著稱。其核心特性包括&#xff1a;高性能架構&#xff1a;基于 ZeroMQ 消息隊列&#xff0c;支持大規模…

Rust → WebAssembly 的性能剖析全指南

一、用優化&#xff08;Release&#xff09;構建 ? 務必在做性能測量前使用 優化模式 構建你的 WASM。默認情況下&#xff1a; wasm-pack build → Release 優化wasm-pack build --dev 或 cargo build → Debug&#xff0c;性能大打折扣 優化編譯能開啟 LLVM 的各項優化和 LT…

第15屆藍橋杯Pthon青少組_國賽_中/高級組_2024年9月7日真題

更多內容請查看網站&#xff1a;【試卷中心 -----> 藍橋杯----> Python----> 國賽】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 第15屆藍橋杯Pthon青少組_國賽_中/高級組_2024年9月7日真題 一、單選題 第 1 題 單選題 下列運算符中&#xff0c;表示并集的…

【Django】-9- 單元測試和集成測試(上)

一、Django 項目單元 & 集成測試準備 &#x1f447;依賴安裝&#xff08;給項目裝 “測試小幫手”&#x1f37c;&#xff09;pdm add -d black isort flake8 pytest pytest-django pytest-coverage &#x1f449; 這行命令像在給項目 “采購” 測試工具&#xff1a;black …

VUE-第二季-01

目錄 1.Vue程序初體驗 1.1 下載并安裝vue.js 1.2 第一個Vue程序 1.3 Vue的data配置項 1.4 Vue的template配置項 1.5 Vue實例 和 容器 的關系是&#xff1a;一夫一妻制 2.Vue核心技術 2.0 Vue的模板語法 2.0.1 插值語法 插值語法總結&#xff1a; 2.0.2 指令語法 指…

Android 15 中禁用/啟用應用的系統級方法

在 Android 15 的開發中,有時我們需要以系統級權限來控制應用的啟用狀態。本文將介紹如何使用 PackageManager 來實現應用的禁用和啟用功能。 核心方法 在 Android 15 代碼中,可以使用以下方法來禁用或啟用應用: packageManager.setApplicationEnabledSetting(pkg,Packag…

2025網絡工程師技能圖譜(附思維導圖)

------------比較全面&#xff0c;供學習參考路線圖。-----------------------

【ROS2】rclcpp::Node 常用 API

ROS 系列學習教程(總目錄) ROS2 系列學習教程(總目錄) 目錄1. 構造函數2. 節點名稱相關3. 獲取log對象句柄4. 回調組相關5. Topic發布與訂閱6. Service服務端與客戶端1. 構造函數 public:Node(const std::string & node_name, const NodeOptions & options NodeOptio…

自動駕駛:技術、應用與未來展望——從開創到全面革新交通出行

一、引言1.1 研究背景與意義在過去的幾十年里&#xff0c;隨著科技的飛速發展&#xff0c;自動駕駛技術逐漸從科幻小說中的概念走進了現實生活。從最初簡單的輔助駕駛功能&#xff0c;到如今高度自動化的自動駕駛系統&#xff0c;這一領域的進步正深刻地改變著我們的出行方式和…

【gradle】插件那些事

文章目錄 1. 前言 2. 插件相關介紹 2.1 gradle插件的apply 2.2 引入自定義插件 2.3 常見構建任務 2.4 gradle生命周期 2.5 gradle的惰性屬性&可注入的服務 2.6 常見命令 檢查依賴樹 查看tasks 構建掃描 查看多項目構建的結構 顯示所選項目的構建腳本依賴項 指定控制臺模式來…

測試平臺如何重塑CI/CD流程中的質量協作新范式

測試平臺如何重塑CI/CD流程中的質量協作新范式 在DevOps革命席卷全球軟件行業的今天&#xff0c;測試的角色正在經歷前所未有的轉變。傳統的"測試最后"模式正在被"測試全程"的新理念所取代&#xff0c;這一轉變背后是測試平臺與CI/CD流程深度融合帶來的質量…

node.js不同環境安裝配置

node.js不同環境安裝配置 Windows環境安裝配置 一、Node.js是什么&#xff1f; ? Node.js是一個基于Chrome V8引擎的[JavaScript運行環境]。 Node.js使用了一個事件驅動、非阻塞式I/O 的模型&#xff0c;Node.js是一個讓JavaScript運行在服務端的開發平臺&#xff0c;它讓J…

深度學習-讀寫模型網絡文件

模型網絡文件是深度學習模型的存儲形式&#xff0c;保存了模型的架構、參數等信息。讀寫模型網絡文件是深度學習流程中的關鍵環節&#xff0c;方便模型的訓練、測試、部署與共享。1. 主流框架讀寫方法&#xff08;一&#xff09;TensorFlow保存模型可以使用 tf.saved_model.sav…

智慧能源管理平臺的多層協同控制架構研究

摘要&#xff1a;針對微電網多源異構設備協同難題&#xff0c;提出一種“云-邊-端”三層智慧能源管理架構。平臺集成數據采集、策略優化與全景分析功能&#xff0c;支持光伏、儲能、充電樁等設備的動態調度&#xff0c;通過自適應算法實現防逆流、需量控制及峰谷套利等策略組合…

MySQL面試題及詳細答案 155道(021-040)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

2025年IntelliJ IDEA最新下載、安裝教程,附詳細圖文

文章目錄下載與安裝IDEA大家好&#xff0c;今天為大家帶來的是IntelliJ IDEA的下載、安裝教程&#xff0c;親測可用&#xff0c;喜歡的朋友可以點贊收藏哦下載與安裝IDEA 首先先到官網下載最新版的IntelliJ IDEA, 下載后傻瓜式安裝就好了 1、下載完后在本地找到該文件&#xf…