C函數基礎.go

前言: 在Go語言中,函數是構成程序的基本模塊,它封裝了一段具有特定功能的代碼,使得代碼更易讀,更易維護和重用。熟練掌握函數的定義、調用以及相關特性是成為Go語言開發者的必經之路。

目錄

函數定義:給代碼找個 “活兒的由頭”

函數調用:使喚函數干活兒

參數傳遞:給函數 “送禮物”

值傳遞:給函數 “拍個照”

指針傳遞:給函數 “鑰匙”

多值傳遞與可變參數:給函數 “大禮包”

匿名函數與閉包:函數界的 “臨時工” 和 “特工”

匿名函數:無名的干活兒的

閉包:偷偷藏變量的 “特工”

函數作為值:函數的 “分身術”

傳遞函數:讓函數 “打工”

返回函數:函數的 “魔法盒子”

總結

函數是編程的 “百寶箱”


函數定義:給代碼找個 “活兒的由頭”

寫代碼的時候,是不是總覺得重復的操作太多,看著就心煩?函數這就派上用場了,把它定義好,以后想用哪兒直接喊它就行。

定義函數就像給代碼立了個 “flag”,告訴它 “要是有這情況,你就按我說的干”。先瞅瞅這基本樣子:

func 我叫啥(給我啥)(還你啥){// 我干啥
}
  • 我叫啥:這就是函數的名字,得叫得響亮又明確,比如叫 煮泡面,一聽就知道是干啥的。

  • 給我啥:參數嘛,就是函數干活兒的原材料。比如 (泡面種類 string, 調料包數 int),意思是我給你泡面和調料包的數量。

  • 還你啥:干完活兒給你的成果,返回值。比如 (好吃的泡面 string),給你一碗熱乎的泡面。

咱整個活兒,定義個 “吹牛” 函數,看這操作:

    func 我吹牛(身份 string,干啥 string) (牛皮 string) {牛皮 = 身份 + " 我昨天 " + 干啥 + " 可厲害了,那場面,絕了!"return
    }

    ?調用一下,看這效果:

    fmt.Println(我吹牛("編程大神", "寫代碼")) 
    // 輸出:"編程大神 我昨天寫代碼可厲害了,那場面,絕了!"

    有了這個函數,以后吹牛都不用費腦子了,直接套模板,是不是絕了?

    函數調用:使喚函數干活兒

    寫好函數不調用,那不就白寫了?調用函數就像使喚小弟一樣,你喊一聲,它就屁顛屁顛來干活兒。

    簡單調用:

    我吹牛("健身達人", "舉鐵")

    要是函數能給你多個結果,你就用多個變量接:

    func 我給信息() (名字 string, 年齡 int) {return "張三", 25
    }他的名字, 他的年齡 := 我給信息()
    fmt.Printf("%s 今年 %d 歲。", 他的名字, 他的年齡)
    // 輸出:"張三 今年 25 歲。"

    ?要是有些返回值不想要,咱就用 _ 來打發它:

    _, 他的年齡 := 我給信息()
    fmt.Printf("年齡:%d", 他的年齡) // 輸出:"年齡:25"

    這不就得了,想干啥干啥,函數聽話得很!

    參數傳遞:給函數 “送禮物”

    參數傳遞就是給函數送東西,讓它用這些東西干活兒。送的方式不一樣,效果也不同。

    值傳遞:給函數 “拍個照”

    值傳遞就是給函數一張參數的 “照片”,函數咋折騰這張照片,原參數都跟它沒關系。

    func 我試試改(x int) {x = 100
    }a := 10
    我試試改(a)
    fmt.Println(a) // 輸出:10,a 一點事沒有

    這就跟給朋友照片讓他隨便畫一樣,原照片還是好好的。

    指針傳遞:給函數 “鑰匙”

    指針傳遞就是把參數的 “鑰匙” 給函數,函數直接去你家改東西。

    func 我真的改(a *int) {*a = 100
    }a := 10
    我真的改(&a)
    fmt.Println(a) // 輸出:100,a 被改了

    這就跟把鑰匙給朋友讓他直接進你家改東西一樣,改完你就懵了。

    多值傳遞與可變參數:給函數 “大禮包”

    有時候要給函數送一堆參數,Go 允許我們用 ... 給它送 “大禮包”。

    func 求和(nums ...int) int {total := 0for _, num := range nums {total += num}return total
    }fmt.Println(求和(1, 2, 3, 4, 5)) // 輸出:15

    這就跟給朋友送一箱零食,讓他一顆一顆吃,最后算總數。

    匿名函數與閉包:函數界的 “臨時工” 和 “特工”

    匿名函數:無名的干活兒的

    匿名函數沒名字,就像臨時工,用完就走,可干活兒利索得很。

    func() {fmt.Println("我是個無名小卒,但能干活兒!")
    }()// 輸出:"我是個無名小卒,但能干活兒!"

    咱也可以把它存起來,想啥時候用就啥時候用:?

    做飯 := func() {fmt.Println("我在做飯!")
    }
    做飯() // 輸出:"我在做飯!"

    閉包:偷偷藏變量的 “特工”

    閉包就是匿名函數偷偷藏了一個變量,像特工一樣,帶著這個變量到處跑。

    func 計數器() func() int {count := 0return func() int {count++ // 偷偷改 countreturn count}
    }計數 := 計數器()
    fmt.Println(計數()) // 輸出:1
    fmt.Println(計數()) // 輸出:2

    這就像有個小本子,每次調用函數就偷偷在小本子上記一筆,下次還能接著記。

    函數作為值:函數的 “分身術”

    在 Go 里,函數可以像玩具一樣被傳來傳去,還能變出新花樣。

    傳遞函數:讓函數 “打工”

    func 干點啥(干啥 func()) {fmt.Println("我要開始啦!")干啥()fmt.Println("干完啦!")
    }做飯 := func() {fmt.Println("做飯中……")
    }
    干點啥(做飯)// 輸出:
    /*
    我要開始啦!
    做飯中……
    干完啦!
    */

    這就跟讓做飯函數去干點啥函數那 “打一天工”,干點啥就是 “工頭”。

    返回函數:函數的 “魔法盒子”

    func GetGreeter(name string) func() {return func() {fmt.Printf("你好呀,%s!\n", name)}
    }greeter := GetGreeter("小明")
    greeter() // 輸出:"你好呀,小明!"

    這就跟打開一個 “魔法盒子”,每次打開都根據名字變出不同的問候。

    總結

    函數是編程的 “百寶箱”

    寶子們,Go 語言的函數就是個 “百寶箱”,你想讓它干啥都能干。從定義、調用到那些奇奇怪怪的參數傳遞,再到匿名函數、閉包、函數作為值這些 “高端操作”,只要掌握了,你寫代碼就跟玩積木一樣,咋搭都好看,還超實用!

    以后寫代碼,多讓函數 “整活兒”,把復雜的事兒交給它,簡單的事兒也交給它,反正啥事兒都能交給它!編程其實就是這么簡單又好玩,沖就完事兒!

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

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

    相關文章

    什么是池化

    池化是深度學習中用于降低數據維度、提取核心特征的一種操作,主要應用于卷積神經網絡(CNN)。其核心思想是通過對局部區域進行聚合統計(如取最大值、平均值),保留關鍵信息的同時減少計算量。 池化的作用 降維…

    C++ 性能分析工具:Valgrind 與 perf

    在 C 開發中,性能優化是提升軟件質量的關鍵環節。內存泄漏和 CPU 資源消耗是最常見的性能瓶頸,而 Valgrind 和 perf 作為專業的性能分析工具,能幫助開發者精準定位這些問題。下面將從工具原理、使用方法、實戰案例等方面進行詳細介紹。 一、…

    ABP VNext + MongoDB 數據存儲:多模型支持與 NoSQL 擴展

    🚀 ABP VNext MongoDB 數據存儲:多模型支持與 NoSQL 擴展(生產級實踐) 目錄 🚀 ABP VNext MongoDB 數據存儲:多模型支持與 NoSQL 擴展(生產級實踐)🎯 引言&#x1f9f0…

    Cursor Rules 的核心定位與作用 DevOps是

    Cursor Rules 是 AI 編程工具 Cursor IDE 中的核心功能,用于約束 AI 生成代碼的行為,確保其符合項目規范、編碼風格或特定技術需求。它本質上是一套持久化、可復用的指令集,會動態插入到 AI 模型的上下文提示中,指導其生成代碼的邏…

    Qt事件處理機制

    事件的概念 在Qt中,以事件驅動UI工具集,包括信號和槽都依賴于Qt的事件處理機制。通常事件是由窗口系統或Qt自身產生的,用以響應所發生的各類事情。如:用戶按下并釋放鍵盤或鼠標、窗口縮放后重繪、定時器到時等。如下圖&#xff1…

    【慧游魯博】【11】小程序端·游覽畫卷修改·支持圖片url格式·結合圖床上傳和加載·數據對接

    文章目錄 需求修改細節前端主要修改點說明:前端傳遞格式 后端ArtifactItem 類:ScrollServiceImpl 類:修改 InfoPanel 結構重構 ScrollHorizontalRollComposer修改后的 ScrollHorizontalRollComposer移除冗余代碼修改總結 數據流圖片格式兼容性…

    攻克SQL審核“最后堡壘”!PawSQL首發T-SQL存儲過程深度優化引擎

    為什么存儲過程審核那么難? 存儲過程將數據操作邏輯固化在數據庫層,一次編譯、多次執行,既能大幅提升性能,也能通過權限隔離增強安全。然而,正因其邏輯復雜、分支眾多,存儲過程內部的 SQL 審核與優化常常成…

    計算機網絡零基礎完全指南

    目錄 ?? 什么是計算機網絡 生活中的類比 計算機網絡的本質 網絡的發展歷程 ?? 網絡IP詳解(重點) 1. IP地址是什么? 生活例子:IP地址就像門牌號 IP地址的格式 IP地址的二進制表示 2. IP地址的分類詳解 A類地址(大型網絡) B類地址(中型網絡) C類地址(小…

    DL___線性神經網絡

    1)回歸(regression)是能為一個或多個自變量與因變量之間關系建模的一類方法。 在自然科學和社會科學領域,回歸經常用來表示輸入和輸出之間的關系。 2)一般回歸是和預測有關,比如預測價格(房屋,…

    WSL2安裝與使用(USB、GPU、虛擬機、圖形界面)

    文章目錄 前言WSL2安裝(手動安裝)WSL2基礎使用VS Code與WSL2配合使用連接USB設備WSL2中使用GPU(RTX5060Ti 16G)與虛擬機兼容使用(Virtual Box)圖形與桌面環境WSL消失(災難性故障)問題…

    uni-app項目實戰筆記16--實現頭部導航欄效果

    先來看效果&#xff1a; 要求&#xff1a;頂部導航欄要始終固定在上方&#xff0c;不隨頁面上下拖動而消失。 代碼實現&#xff1a; 1.定義一個自定義導航欄組件&#xff1a;custom-nav-bar.vue&#xff0c;并寫入如下代碼&#xff1a; <template><view class"…

    web3.js 核心包及子模塊

    . 核心包 (web3) 功能:提供基礎連接、工具函數和核心功能。 包含子模塊: web3.eth - 以太坊區塊鏈交互 web3.utils - 輔助工具函數 web3.shh - Whisper 協議(已廢棄) web3.bzz - Swarm 去中心化存儲(已廢棄) web3.net - 網絡相關功能 web3.contract - 智能合約交互 web3.…

    訓練檢測之前的視頻抽幀

    接下來安裝pytorch Previous PyTorch Versions 視頻抽幀 import cv2def extract_frames(video_path, output_folder, frame_rate1):"""從視頻中抽取幀。:param video_path: 視頻文件的路徑:param output_folder: 存儲幀的文件夾路徑:param frame_rate: 抽取的…

    智能家居HA篇 二、配置Home Assistant并實現外部訪問

    智能家居HA篇 一、Win10 VM虛擬機安裝 Home Assistant 手把手教學 二、通過Cpolar配置Home Assistant并實現外部訪問 文章目錄 智能家居HA篇前言一、內網穿透工具&#xff08;cpolar&#xff09;二、映射HA端口1.訪問cpolar儀表2.創建賬號并登錄3.創建隧道 三、HA設置及公網訪…

    day09——Java基礎項目(ATM系統)

    文章目錄 Java項目實戰&#xff1a;手把手開發ATM銀行系統&#xff08;附完整源碼&#xff09;一、系統架構設計1. 三層架構模型2. 核心數據結構 二、核心功能實現1. 開戶功能&#xff08;含唯一卡號生成&#xff09;2. 登錄安全驗證3. 存取款業務4. 安全轉賬實現 三、賬戶安全…

    計算機網絡:(五)信道復用技術,數字傳輸系統,寬帶接入技術

    計算機網絡&#xff1a;&#xff08;五&#xff09;信道復用技術&#xff0c;數字傳輸系統&#xff0c;寬帶接入技術 前言一、信道復用技術1. 為什么需要復用技術&#xff1f;2. 頻分復用&#xff08;FDM&#xff09;3. 時分復用&#xff08;TDM&#xff09;4. 統計時分復用&am…

    【期末總結】計算機網絡

    【期末總結】計算機網絡 參考鏈接&#xff1a;計算機網絡知識點全面總結&#xff08;有這一篇就夠了&#xff01;&#xff01;&#xff01;&#xff09;-CSDN博客 一.概述 1.1 計算機網絡的分類 按照網絡的作用范圍&#xff1a;廣域網&#xff08;WAN&#xff09;、城域網&a…

    React學習001-創建 React 應用

    React學習001-創建 React 應用 1、安裝node.js2、安裝構建工具2.1 核心特性2.2 性能對比??2.3 適用場景?? 3、創建應用4、項目啟動參考文章 1、安裝node.js 這里建議安裝nvm多版本管理node.js&#xff0c;想用哪個版本&#xff0c;一條命令即可~ 多版本管理node.js 2、安…

    (cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening

    論文&#xff1a;(cvpr2025) Adaptive Rectangular Convolution for Remote Sensing Pansharpening 代碼&#xff1a;https://github.com/WangXueyang-uestc/ARConv.git 這個論文研究的是全色與多光譜圖像的融合。作者認為現有的基于CNN的方法中&#xff0c;傳統的卷積存在兩個…

    【圖像處理入門】7. 特征描述子:從LBP到HOG的特征提取之道

    摘要 特征描述子是圖像處理中提取圖像本質信息的關鍵工具。本文將深入講解局部二值模式(LBP)與方向梯度直方圖(HOG)兩種經典特征描述子的原理、實現方法及應用場景。結合OpenCV代碼示例,展示如何利用LBP提取紋理特征、使用HOG進行目標檢測,幫助讀者掌握從圖像中提取有效…