go語言 函數和包

go語言 函數和包

一、函數

在Go語言中,函數是執行特定任務的自包含代碼塊。

1.函數的定義

函數通過func關鍵字定義,格式如下:

func 函數名(形參 形參類型, 形參 形參類型) 返回值類型 {函數體return 返回值
}

2.基礎函數類型

  • 無參數無返回值
  • 單個參數,無返回值
  • 多個相同類型參數,無返回值
  • 多個不同類型參數,無返回值
  • 多個參數,一個返回值
  • 多個參數,多個返回值
package mainimport "fmt"func main() {demo01()//demo02("d") // 類型不匹配demo02(2)demo03(1, 2)demo04(1, "A")var res = demo05(1, 2)fmt.Println("a+b:", res)var res1, res2 = demo06(1, 1)fmt.Println(res1, res2)
}// 無參數無返回值
func demo01() {fmt.Println("hello world")
}// 單個參數,無返回值
func demo02(a int) {fmt.Println("a:", a)
}// 多個相同類型參數,無返回值
func demo03(a, b int) {fmt.Println("a+b:", a+b)
}// 多個不同類型參數,無返回值
func demo04(a int, b string) {fmt.Println("a:", a)fmt.Println("b:", b)
}// 多個參數,一個返回值
func demo05(a, b int) int {return a + b
}// 多個參數,多個返回值
func demo06(a, b int) (int, bool) {if a+b > 3 {return a + b, true} else {return a * b, false}
}

3.特殊函數類型

  • 匿名函數test06展示了如何在Go中定義匿名函數,即沒有函數名的函數。
  • 函數作為一等公民f變量可以存儲函數,test11返回一個函數作為其結果。
  • 命名返回值test10展示了如何使用命名返回值,這有助于提高代碼的可讀性。
  • 閉包test12是一個閉包示例,它捕獲并使用外部作用域的變量。
  • 函數作為參數test14接受一個函數作為參數,并在函數體內調用它。
  • 類型重命名MyFuncfunc(string) (int, int)類型的別名。
package mainimport "fmt"func main() {demo01()// 函數作為一等公民var demo02 = func(a, b int) int {return a + b}var res = demo02(15, 16)fmt.Println(res)var res1, res2 = demo03(16, 17)fmt.Println(res1, res2)// 閉包var ff = demo04(15)ff()// 函數作為參數var f1 = func(a int) {fmt.Println(a)}demo05(15, f1)// 類型重命名type StringProcessor func(string) stringprocessor := StringProcessor(func(input string) string {return "Processed: " + input})result := processor("Input")fmt.Println(result)}// 匿名函數
func demo01() {fmt.Println("demo01--start")// 定義匿名函數并立即執行func() {fmt.Println("demo01--inner")}()fmt.Println("demo01--end")
}// 命名返回值
func demo03(a, b int) (sum int, flag bool) {sum = a + bflag = true//return sum, flag   // 可以指定return // 也可以不在指定
}// 閉包
func demo04(x int) func() {x = 666f := func() {fmt.Println("我是內部函數", x)}return f
}// 函數作為參數
func demo05(a int, f func(i int)) {f(a)
}

4.裝飾器函數

  • Go語言雖然沒有像一些其他語言(例如Python)那樣的裝飾器語法,但是可以通過閉包來實現類似的功能。

  • 裝飾器通常用于在不修改原始函數代碼的情況下增加函數的功能。

  • 示例

package mainimport ("fmt""time"
)// 普通函數
func sayHello(name string) string {time.Sleep(time.Second) // 延遲1秒return "Hello " + name
}// 自定義裝飾器,計時功能
func timeTrack(fn func(string) string) func(string) string {return func(name string) string {startTime := time.Now()              //  記錄開始時間result := fn(name)                   //  調用原始函數elapsedTime := time.Since(startTime) //  計算經過時間fmt.Printf("耗時: %s \n", elapsedTime)return result}
}
func main() {// 使用裝飾器增強原始函數enhanceSayHello := timeTrack(sayHello)helloMessage := enhanceSayHello("world")fmt.Println(helloMessage)
}

二、包

在Go語言中,包(package)是組織源代碼的基本單位,它有助于代碼的可重用性和可讀性

1.包規則

  1. 導出規則:如果一個函數、變量或類型的名稱以大寫字母開頭,它就是導出的(exported),這意味著它可以在包外部被訪問和使用。如果以小寫字母開頭,則它在包外部是不可見的。
  2. 包名一致性:在同一個文件夾下的所有Go源文件應該屬于同一個包,并且包名通常建議與文件夾名相同。這是為了保持代碼的清晰和易于理解。
  3. 包內部可見性:在同一個包內的所有源文件共享相同的包級作用域,這意味著這些文件中的所有變量、函數和類型都像是在同一個文件中一樣可見。
  4. 使用包:要使用其他包中的導出成員,需要導入對應的包,并通過包名來引用它們。
  5. 導入包:使用import關鍵字來導入包。導入時,通常使用包的全路徑名,例如import "demo/common"
  6. 導入并重命名包:如果包名沖突或者為了方便引用,可以在導入時為包指定一個新的名稱,例如import cv1 "demo/common/v1"
  7. 一次導入多個包:可以通過一對花括號來一次導入多個包,這樣可以保持代碼的整潔。

2.示例

  • 目錄結構

    • demo/
      ├── common/
      │   ├── v1/          # v1 是 common 包的一個子目錄,表示版本1
      │   │   └── demo01.go # demo01.go 是 common 包 v1 版本的實現文件
      │   ├── demo02.go    # demo02.go 是 common 包的一部分,不在任何子目錄中
      │   └── demo01.go    # 這是 common 包的另一個實現文件,可能與 v1 版本不同
      └── main.go          # main.go 是 main 包的入口文件,通常包含 main 函數
      └── go.mod           # go.mod 是 Go 模塊的配置文件,記錄模塊的依賴關系
      
  • 文件內容

    • // main.go
      package main// 導入標準庫中的fmt包
      import "fmt"// 一次導入多個包
      import ("demo/common"cv1 "demo/common/v1" // // 導入包并重命名
      )func main() {// 使用fmt包的Println函數fmt.Println("Hello, world!")res1 := common.Add(1, 2)fmt.Println(res1)res2 := cv1.Mul(4, 5) // 使用重命名的包fmt.Println(res2)
      }
    • // common/demo01.gopackage common
      func Add(a, b int) int {return a + b
      }
      
    • // common/demo02.gopackage common
      func Addd(a, b int) int {return Add(a, b) + b
      }
      
    • // common/v1/demo01.gopackage v1
      func Mul(a, b int) int {return a * b
      }
      

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

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

相關文章

vue中數組出現__ob__: Observer屬性,導致不能正確使用問題解決

直接上圖,如下圖,數組中出現__ob__: Observer屬性,導致無法取值。 解決方案為:JSON.parse(JSON.stringify(數組變量名))深拷貝數組,重新生成一個可枚舉數組。 // 處理代碼如let tempIds JSON.parse(JSON.stringify(i…

一文帶你初探FreeRTOS信號量

本文記錄我初步學習FreeRTOS的信號量的知識,在此記錄分享,希望我的分享對你有所幫助! 什么是信號量 在FreeRTOS中,信號量(Semaphore)是一種用于任務間同步和資源共享的機制。信號量主要用于管理對共享資源的…

Cgi上傳文件 注意事項

//核心代碼 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //錯誤方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 參考博客&#xff1a; https://blog.cs…

GNU/Linux - 各種包管理器介紹

Linux 包管理器根據不同的發行版和包管理系統有所不同。以下是一些常見的 Linux 包管理器&#xff1a; 1. RPM (Red Hat Package Manager) * 用于&#xff1a; Red Hat Enterprise Linux (RHEL), Fedora, CentOS, openSUSE * 包管理器&#xff1a; rpm, yum, dnf 2. DEB (Deb…

HTML如何在圖片上添加文字

HTML如何在圖片上添加文字 當我們開發一個頁面&#xff0c;插入圖片時&#xff0c;需要有一組文字對圖片進行描述。那么HTML中如何在圖片上添加文字呢&#xff1f;這篇文章告訴你。 先讓我們來看下效果圖&#xff1a; 句子“這是一張夜空圖片”被放置在了圖片的左下角。 那么…

Leetcode.342 4的冪

給定一個整數&#xff0c;寫一個函數來判斷它是否是 4 的冪次方。如果是&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 整數 n 是 4 的冪次方需滿足&#xff1a;存在整數 x 使得 n 4x 示例 1&#xff1a; 輸入&#xff1a;n 16 輸出&#xff1a;true示…

微信小程序的智慧物流平臺-計算機畢業設計源碼49796

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3研究方法 1.4開發技術 1.4.1 微信開發者工具 1.4.2 Node.JS框架 1.4.3 MySQL數據庫 1.5論文結構與章節安排 2系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 用戶登錄流程 2.2.2 數據刪除流程 2.3 系統功能分…

C#面:ASP.NET Core Filter如何?持依賴注??

ASP.NET Core Filter可以通過依賴注入來支持。在ASP.NET Core中&#xff0c;依賴注入是一種將依賴對象提供給類的機制&#xff0c;它可以幫助我們解耦和測試代碼。 要在ASP.NET Core Filter中使用依賴注入&#xff0c;可以按照以下步驟進行操作&#xff1a; 首先&#xff0c;…

ESP32CAM物聯網教學09

ESP32CAM物聯網教學09 攝像頭配上顯示屏 小智給攝像頭配上了一塊液晶顯示屏,ESP32Cam變得更加酷炫了,應用也更加廣泛了。 TFT彩色顯示屏從第一課的CameraWebServer開始,我們一直都是利用瀏覽器來查看顯示攝像頭的視頻流,都需要借助這個網頁提供的服務。 可以讓ESP32Cam開…

【案例干貨】智能導覽智慧景區系統小程序開發主要功能

智能景區/園區導覽系統是一種利用云計算、物聯網等新技術&#xff0c;通過互聯網或移動互聯網&#xff0c;借助便攜的終端上網設備&#xff0c;為游客提供全方位、便捷化街區導航與信息服務的系統。 其主要功能可以歸納為以下幾個方面&#xff1a; 1. 街區資訊展示 信息介紹&…

纏中說禪李彪08年“假死”具體原因探討

在纏中說禪的信徒圈內&#xff0c;流傳著創始人李彪于2008年逝世的說法&#xff0c;這一事件常被描繪成一種悲壯的犧牲&#xff0c;仿佛是為了其理念與信徒們的福祉鞠躬盡瘁。然而&#xff0c;這一“逝世”既未經公開證實&#xff0c;也與李彪生前構建的高大名聲形成了某種諷刺…

短鏈接學習day2

用戶敏感信息脫敏展示&#xff1a; RequestParam 和 PathVariable的區別 注解是用于從request中接收請求的&#xff0c;兩個都可以接收參數&#xff0c;關鍵點不同的是RequestParam 是從request里面拿取值&#xff0c;而 PathVariable 是從一個URI模板里面來填充。 PathVari…

異步加載與動態加載

異步加載和動態加載在概念上有相似之處&#xff0c;但并不完全等同。 異步加載&#xff08;Asynchronous Loading&#xff09;通常指的是不阻塞后續代碼執行或頁面渲染的數據或資源加載方式。在Web開發中&#xff0c;異步加載常用于從服務器獲取數據&#xff0c;而不需要用戶等…

昇思25天學習打卡營第12天|ResNet50遷移學習

昇思25天學習打卡營第12天|ResNet50遷移學習 前言ResNet50遷移學習數據準備下載數據集 加載數據集數據集可視化 訓練模型構建Resnet50網絡固定特征進行訓練訓練和評估可視化模型預測 個人任務打卡&#xff08;讀者請忽略&#xff09;個人理解與總結 前言 非常感謝華為昇思大模型…

vite簡介

vite是新一代前端構建工具&#xff0c;vite具有優勢如下&#xff1a; 輕量快速的熱重載&#xff08;HMR&#xff09;&#xff0c;能實現快速的服務啟動。對TypeScript、JSX、CSS等支持開箱即用。真正的按需編譯&#xff0c;不再等待整個應用編譯完成。webpack構建與vite構建對…

Java 遍歷Map的方法

在Java中遍歷Map可以采用以下幾種常見方法&#xff1a; 1、使用 entrySet 遍歷 這是最常見的遍歷方式&#xff0c;同時訪問鍵值對。 for (Map.Entry<K, V> entry : map.entrySet()) {K key entry.getKey();V value entry.getValue();// 處理鍵值對} 2、遍歷 keySet 后…

【Java】CompletableFuture+Mockito單元測試不通過 Unnecessary stubbings detected

文章目錄 問題描述問題分析解決Thread.sleepget()Mockito.lenient() 問題描述 有個接口使用CompletableFuture實現的異步調用&#xff0c;現在要用Mockito寫單元測試 Testpublic void updateNumAsync() {Integer newNum 600;// updateRoleCountAsync用CompletableFuture異步調…

Jenkins 強制殺job

有時候有的jenkins job運行時間太長&#xff0c;在jenkins界面點擊x按鈕進行abort&#xff0c;會失敗&#xff1a; 這時候點擊&#xff1a; “Click here to forcibly terminate running steps” 會進一步kill 任務&#xff0c;但是也還是有殺不掉的可能性。 終極武器是jenkin…

vue3【提效】使用 VueUse 高效開發(工具庫 @vueuse/core + 新增的組件庫 @vueuse/components)

Vueuse 是一個功能強大的 Vue.js 生態系統工具庫&#xff0c;提供了可重用的組件和函數&#xff0c;幫助開發者更輕松地構建復雜的應用程序。 官網 &#xff1a;https://vueuse.org/core/useWindowScroll/ 安裝 VueUse npm i vueuse/core vueuse/components&#xff08;可選&a…

llm學習-4(llm和langchain)

langchain說明文檔&#xff1a;langchain 0.2.6 — &#x1f99c;&#x1f517; langChain 0.2.6https://api.python.langchain.com/en/latest/langchain_api_reference.html#module-langchain.chat_models 1&#xff1a;模型 &#xff08;1&#xff09;自定義模型導入&#x…