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

avatar-img
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
本章節旨在教導讀者如何在 Kotlin 中引入套件。將會涵蓋如何引用第三方套件,如何引用自定義模組,以及如何創建和引用自定義套件。此外,還會列出一些常用的套件,以供讀者參考。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節的目的是介紹Java中的套件使用,包括如何引用第三方套件和自定義模組,如何創建和使用自定義套件,以及介紹一些常見的Java標準庫套件。這些內容將幫助讀者更好地理解和使用Java的套件系統。
Thumbnail
本章節旨在教導讀者如何在 Kotlin 中引入套件。將會涵蓋如何引用第三方套件,如何引用自定義模組,以及如何創建和引用自定義套件。此外,還會列出一些常用的套件,以供讀者參考。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
套件(Package)是將程式或程式庫進行組織、分發和共享的一種方式。在軟體開發中,套件通常包含了相關的程式碼、資源文件和元數據,並提供了統一的名稱空間和版本管理。
Thumbnail
本章講述了C#開發中的程序集,命名空間和 NuGet 包管理器。程序集是 .NET 應用的基礎,命名空間用於組織和預防命名衝突,而 NuGet 用於管理 .NET 的外部庫和依賴項。
Thumbnail
Python的模組和庫是可重用的程式碼塊,可透過import語句引入。特定部分可以透過from和import引入,並可使用as指定別名。第三方模組可透過pip工具安裝並在程式碼中使用。此外,也可以創建自定義模組並在其他Python文件中引用。
Thumbnail
Docker-Compose負責對container做快速編排。設定檔預設名稱為docker-compose.yml,在檔案中,可以透過COMPOSE_FILE或-f對設定進行定義。 想要將專案透過Docker-Compose部署,需要創建docker-compose.yml和Dockerfile
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞