Package:Golang 專案的組織策略

閱讀時間約 9 分鐘


raw-image

👨‍💻簡介

套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。

package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。

今天這篇文章將快速瞭解 Golang 的package,學習如何建立package、匯入package以及一些使用技巧。

什麼是 Package?

在 Golang 中,Package 是一種組織程式碼的方式,它將相關的函式、變數和資源放在一個目錄中。這不僅有助於保持程式碼的整潔,還能讓我們更容易地重複使用程式碼。

Package 名稱與資料夾名稱的一致性

通常建議在建立package時,將package名稱與所在資料夾名稱保持一致,這樣有助於提高程式碼的可讀性和一致性。Golang 的匯入機制是基於package的 import 路徑來識別package,而 import 路徑通常會反映package的資料夾結構。這種一致性可以讓其他開發人員更容易理解你的程式碼,並且不需要額外的查找工作,因為package的名稱與資料夾名稱一致。

舉例來說,假設你的資料夾結構如下:

project/
|-- greetings/
| |-- greetings.go
|
|-- main/
| |-- main.go

如果我們建立的package名稱為 greetings,我們可以在 greetings.go 中這樣定義:

// greetings.go
package greetings

func Hello(name string) string {
return "Hello, " + name
}

然後在 main.go 中使用這個package:

// main.go
package main

import (
"fmt"
"your/project/path/greetings"
)
func main() {
message := greetings.Hello("Alan")
fmt.Println(message)
}

在這個例子中,我們建立的package名稱 greetings 與所在資料夾名稱相同,確保匯入的時候路徑是一致的。

建立 Package

建立一個 Package之前,首先,我們需要創建一個目錄,我們取名叫 greetings

  1. 在你的工作目錄底下創建一個新資料夾:greetings
  2. greetings 資料夾中,創建一個名為 greetings.go 的檔案
// greetings/greetings.go
package greetings

import "fmt"
func SayHello(name string) {
fmt.Println("Hello, " + name + "!")
}

可以看到,我們在 greetings 中建立了一個 SayHello 函式,讓我們可以打個招呼。

使用 Package

現在我們已經建立完 Package,讓我們來看看如何使用它:

  1. 使用 go mod init xxx 初始化專案以設定路徑,假設這邊是叫demo
  2. 創建一個名為 main.go 的檔案,放在與 greetings 資料夾不同的目錄下。
  3. 編寫以下程式碼:
// main.go
package main

import "demo/greetings"

func main() {
greetings.SayHello("Alan")
}

在main.go直接使用 greetings.SayHello 函式來印出hello到終端。

最後,我們可以在終端中執行我們的程式:

go run main.go

你應該會在終端看到輸出的問候訊息:「Hello, Alan」

到這裡已經成功地創建了一個 Golang 的 Package,並在自己的程式中使用它。

package的可見性

Golang 中的package成員有可導出(Exported)和不可導出(Unexported)之分。首字母大寫的成員是可導出的,其他package可以存取它們;而首字母小寫的成員則是不可導出的,僅在同一package內可見。以下是一個示例:

// greetings/greetings.go
package greetings

func sayHi(name string) {
fmt.Println("Hi, " + name + "!")
}

在這個範例中,sayHi 是不可導出的,無法在其他package中使用。

匯入package

匯入多個package

你可以使用括號匯入多個package,以提高程式碼的可讀性:

package main

import (
"fmt"
"your/project/path/greetings"
"your/project/path/utils"
)
func main() {
greetings.SayHello("Alan")
fmt.Println("Cube of 3:", utils.Cube(3))
}

package別名

當我們引入一個package時,我們可以為該package指定一個別名。這對於解決名稱衝突或縮短package名稱都很有用。

import mygreetings "your/project/path/greetings"

使用方式也很簡單,在package前面加上別名即可

接著調用函式如下

func main() {
mygreetings.SayHello("Alan")
}

這樣,你就可以使用 mygreetings 作為 greetings package的別名,以更簡潔的方式訪問package中的函式。

這個方式尤其在當你的專案中有多個package需要引入時很有用,因為它可以幫助你更好地管理package的命名空間。

匿名package

假設你的 greetings package路徑仍然是 your/project/path/greetings,你可以引入它並使用匿名package,如下所示:

import _ "your/project/path/greetings"

可以看到,我們使用 _ 作為匿名package的名稱,這表示我們不打算在程式碼中直接使用 greetings package的名稱,但我們希望它執行package初始化的工作。

在這種情況下,你不需要在後續的程式碼中使用 greetings package的名稱,而package初始化的工作仍然會執行,如果 greetings package具有初始化邏輯(init 函式),那麼它將在引入時運行。

在某些情況下,你可能希望引入一個package,但你不打算在你的程式碼中直接使用該package中的函式或資源。相反,你只對package的一些「副作用」或初始化操作感興趣。這些初始化操作可能包括設置全局變數、執行某些初始化函式或設定package的配置。

使用匿名package的方式,你可以引入package,使它執行初始化操作,但你不需要在你的程式碼中使用它的功能。這就是「只關心副作用」的意思。你不需要直接與package的功能交互,只是希望package在你的程式啟動時執行某些操作,然後你的程式可以繼續運行。

舉個例子,假設你有一個package,它在初始化時設置了一個全局的日誌記錄器,但你的主程式不需要直接使用這個日誌記錄器。你可以使用匿名package的方式引入這個package,這樣它會在程式啟動時設置日誌記錄器,而你的程式可以繼續執行自己的邏輯,而不必直接與日誌package交互。

package的版本控制

管理package的版本是非常重要的。你可以使用 go get 命令安裝package並更新版本:

go get -u your/project/path/greetings

package的佈署與分享

如果你想分享你的package給其他人,你可以將package的原始碼上傳至版本控制系統,如 GitHub。其他人可以透過 go get 命令來安裝並使用你的package。

小結

package在 Golang 中扮演著組織程式碼、重複使用程式碼的重要角色。透過本文,我們學習了建立package、匯入package以及一些使用技巧,希望能幫助你更深入地理解 Golang 的package世界!

📚Reference

17會員
83內容數
golang
留言0
查看全部
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 在Go語言中,Interface 是一個重要且強大的概念。Interface提供了一種方式來定義對象之間的契約,讓你可以設計更具有靈活性和可擴展性的程式碼。 你可以把Interface想像成是一種約定,讓不同的東西彼此溝通的方式變得特別靈活和好擴充,告訴程式裡的各個元件彼此要怎麼合作
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
👨‍💻簡介 在 Go 語言中,有著一個強大又便捷的工具,可以讓你以鍵-值(Key-Value)的形式儲存和查詢資料,它就是「Map」。Map 在 Go 語言中扮演了重要的角色,簡化了許多資料處理的任務,現在讓我們一起來深入了解這個有趣的資料型別。 Map的基本概念 Map 是 Go 語
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
👨‍💻簡介 在Go語言中,Interface 是一個重要且強大的概念。Interface提供了一種方式來定義對象之間的契約,讓你可以設計更具有靈活性和可擴展性的程式碼。 你可以把Interface想像成是一種約定,讓不同的東西彼此溝通的方式變得特別靈活和好擴充,告訴程式裡的各個元件彼此要怎麼合作
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
👨‍💻簡介 在 Go 語言中,有著一個強大又便捷的工具,可以讓你以鍵-值(Key-Value)的形式儲存和查詢資料,它就是「Map」。Map 在 Go 語言中扮演了重要的角色,簡化了許多資料處理的任務,現在讓我們一起來深入了解這個有趣的資料型別。 Map的基本概念 Map 是 Go 語
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
有鑑於於市場上總是無法將 CPO 技術與光通訊模組之架構、運行方式與發展個別說清,讓非技術背景出身之投資人容易產生混淆,個人則希望透過本篇介紹將讓投資人對於 CPO 技術有一基本認知。下一篇則將針對該族群進行營運與財務數據分析。 (本篇僅開放2小時觀看,之後僅供訂閱會員參考! 歡迎加入訂閱
Thumbnail
科技日益進步的現代,網路與我們息息相關。 我們經常使用蝦皮、MOMO 等網購平台進行購物,在方便的同時也節省時間、增加效率。 然而,在網購拆封包裹的同時,無形中卻造成了資源的浪費,產生了許多的廢棄物,進一步增加環境的負擔。 那我們能如何解決這樣的困擾, 在安心購物的同時又不會成為傷害地球的幫兇
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
你好,歡迎閱讀《紫式書摘》。 我是王啟樺,目前在加州大學洛杉磯分校(UCLA)擔任統計機器學習方向的博士後研究員。 這篇文章是《紫式書摘》的第003篇文章,紀錄了我閱讀《Publishing Python Packages》的Chapter 1後,產生對「套件(Package)」的一些想法隨筆。
Thumbnail
加拿大的外匯車會不會比較便宜? 我們今天找的這BMW X4是加拿大的車,用這一台2022 BMW X4 xDrive30i M ,配備有Sport Package的車輛來估價,之後再找一台條件差不多,但是來自美國的X4,二台車的價錢都算給您看。
Thumbnail
交車立即來店,快速介紹【小鱷魚】卻擁【哥吉拉】心臟的718 GT4 RS 要說是911 GT3 RS 同門兄弟一點也不過分 快速科普這台 保時捷 史無前例 的作品 718 GT4 RS 目前傳聞會是保值神器的它,有什麼過人之處呢? 讓我們一起看下去- 全新Porsche 718
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
有鑑於於市場上總是無法將 CPO 技術與光通訊模組之架構、運行方式與發展個別說清,讓非技術背景出身之投資人容易產生混淆,個人則希望透過本篇介紹將讓投資人對於 CPO 技術有一基本認知。下一篇則將針對該族群進行營運與財務數據分析。 (本篇僅開放2小時觀看,之後僅供訂閱會員參考! 歡迎加入訂閱
Thumbnail
科技日益進步的現代,網路與我們息息相關。 我們經常使用蝦皮、MOMO 等網購平台進行購物,在方便的同時也節省時間、增加效率。 然而,在網購拆封包裹的同時,無形中卻造成了資源的浪費,產生了許多的廢棄物,進一步增加環境的負擔。 那我們能如何解決這樣的困擾, 在安心購物的同時又不會成為傷害地球的幫兇
Thumbnail
👨‍💻簡介 套件(Package)在Golang中扮演著組織和管理程式碼的重要角色。 package就像工具箱一樣,裡面裝滿各種不同的工具,每個工具都有特定的功能。這些工具能夠幫助你完成不同的任務,從修理家具到蓋小屋,樣樣都行。
Thumbnail
你好,歡迎閱讀《紫式書摘》。 我是王啟樺,目前在加州大學洛杉磯分校(UCLA)擔任統計機器學習方向的博士後研究員。 這篇文章是《紫式書摘》的第003篇文章,紀錄了我閱讀《Publishing Python Packages》的Chapter 1後,產生對「套件(Package)」的一些想法隨筆。
Thumbnail
加拿大的外匯車會不會比較便宜? 我們今天找的這BMW X4是加拿大的車,用這一台2022 BMW X4 xDrive30i M ,配備有Sport Package的車輛來估價,之後再找一台條件差不多,但是來自美國的X4,二台車的價錢都算給您看。
Thumbnail
交車立即來店,快速介紹【小鱷魚】卻擁【哥吉拉】心臟的718 GT4 RS 要說是911 GT3 RS 同門兄弟一點也不過分 快速科普這台 保時捷 史無前例 的作品 718 GT4 RS 目前傳聞會是保值神器的它,有什麼過人之處呢? 讓我們一起看下去- 全新Porsche 718