在學習go之前我是一個ruby開發者,ruby有個我很喜歡的技術叫做NameSpace命名空間,這樣有助於程式碼隔離以及重複混入達到DRY,go也有命名空間,我們先來比較兩者的差異吧,ruby的命名空間使用module ,go的命名空間會使用package , 兩者的差異表格如下
功能/特點 | Ruby (模块) | Go (包) |
---|---|---|
定義 | 使用 module 關鍵字 |
使用 package 關鍵字 |
用途 | 提供命名空間、包裝方法、常量和類 | 提供命名空間、封裝代碼 |
導入方式 | require 或 require_relative |
import |
文件結構 | 通常一個模块對應一個 .rb 文件 |
一個包可以包含多個 .go 文件 |
訪問控制 | 模块本身不提供訪問控制,但模块内的常量、方法和類可以有 public , private , protected 限制 |
使用名稱首字母大小寫來控制可見性:大寫為公共,小寫為私有 |
巢狀命名空間 | 可以有巢狀模块 | 不直接支持,但可以通過子文件夾和子包來模擬 |
初始化 | 當模块被 require 時不保證會執行特定初始化代碼 |
有 init 函數,每個文件可以有多個,且在包被導入時自動執行 |
慣例 | 通常使用大駝峰命名法(例如:MyModule ) |
使用小寫並且多個單詞之間使用下劃線(例如:mypackage ) |
├── go.mod
├── main.go
└── person
├── name.go
└── verb.go
// go.mod
// go mod init gopratice 產生的
module gopratice
go 1.19
// main.go
package main
import (
"fmt"
"gopratice/person"
)
func main() {
person.Name("John")
person.Verb("running")
fmt.Println("Done")
}
// person/name.go
package person
import "fmt"
func Name(p string) {
fmt.Printf("Current person is: %+v\n", p)
}
// person/name.go
package person
import "fmt"
func Verb(v string) {
fmt.Printf("Current verb is: %+v\n", v)
}
public
, private
, protected
等控制去控制存取,go是使用名稱首字母大小寫來控制可見性:大寫為公共,小寫為私有模組(module)在 Go 語言中是一個重要的概念,一個模組是相關套件的集合,並且包括一個 go.mod 文件,其中定義了模組的路徑和依賴關係
在專案的根目錄輸入
go mod init [模組名稱]
以上面示例為例 go mod init gopratice
若你有加入程式或移除套件時,應於terminal下指令重整go.mod
go mod tidy
若要下載第三放套件可以使用下方語法
go get <package>@<version>
你可以使用上述命令显式地升級或降級一個套件到指定的版本。
以下的路徑指向模組中的特定套件:
import <別名> <套件>
以下例子
package main
import (
f "fmt"
)
func main() {
f.Println("hello")
}
Go 程式是透過套件來組織的。package <pkgName>
這一行告訴我們當前檔案屬於哪個套件
可執行的套件有兩個特徵
package main
如果main函式不在main裡,構建函式就不會生成可執行的文件
而套件名 main 則告訴我們它是一個可獨立執行的套件,它在編譯後會產生可執行檔案
任何套件,都可以定義一個函式叫 init()
package main
import (
"fmt"
)
func init() {
fmt.Println("hello world")
}
func main() {
fmt.Println("main 函式")
}
這個執行的順序為
The Go Workshop 完全自學Go語言