go語言必須有一個什麼包

2023-01-04 22:01:11

go語言必須有一個main包。Go語言是編譯型的靜態語言,所以在執行Go語言程式之前,需要先將其編譯成二進位制的可執行檔案;而要生成Go語言可執行程式,必須要有名為main的包,且在該包下必須有且只有一個main函數。

本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

1. 包的概念和原始檔

Go程式是通過把包連結到一起構成的。包是由一個個一起定義了屬於該包的常數、型別、變數、函數(它們可以被同一個包內的所有檔案存取,也可以通過匯出而被其他的包使用)的原始檔構成的。每個包的程式碼都可以作為很小的複用單元,被其他專案所參照。

每個原始檔都有一個package語句定義了它屬於哪 個包,後面跟著可能為空的import集合宣告了需要使用哪些包,再往後跟著可能為空的函數、型別、變數、常數的集合。

我們可以看到名為code和errno的檔案的歸屬包,都為errno,這就表明,在Go中並不像Java那樣以一個類作為複用單元,而是以包作為一個很小的複用單元。

總結:在Go中最小的單元是包,而包下的可以有多個原始檔,原始檔就相當於class類,每個原始檔通過package語句宣告了該檔案屬於哪個包。

2. main包

在Go語言裡,命名為main的包具有特殊的含義。Go語言的編譯程式會試圖把這種名字的包編譯為二進位制的可執行檔案。所有用Go語言編譯的可執行程式都必須有一個名為main的包。

簡單來說:要生成Go語言可執行程式,必須要有名為main的package包,且在該包下必須有且只有一個main函數

當編譯器發現這個某個包的名字為main是,它一定也會發現名為main()是函數,否則不會建立可執行檔案。main()函數是程式的入口,所以,如果沒有這個函數,程式就沒有辦法開始執行。程式編譯時,會使用宣告main包的程式碼所在的目錄的目錄名作為二進位制可執行檔案的檔名。

3. 包目錄的命名規範

所謂無規矩不成方圓,在開發Go語言之前,我們一定要了解Go語言的一些特性和規範才能更好的開發出高品質,可通用的程式碼,不然開發出一個只有你能看明白的程式,那隻能算是自娛自樂罷了。本節根據一些經典程式碼和公司開發習慣給出了一個命名規範範例,範例如下:

下面根據這個範例圖,講解一下我理解的開發規範:

  • conf: 本目錄主要儲存組態檔

  • handler:主要存放一些程式的入口檔案,相當於Java中的Collter層

  • model:主要存放於資料庫操作相關的檔案

  • pkg:主要儲存一些通用的工具類等程式碼

  • router:主要儲存路由服務的程式碼

  • service:主要儲存業務程式碼

  • vendor:主要儲存專案本身的依賴包

  • conf.yaml:專案的組態檔,可放在跟目錄下,也可放在conf資料夾下

  • main.go:程式的入口,一般放置在根目錄下

4. 匯入

包的引入原理

程式的初始化和執行都起始於main包。如果main包還匯入了其它的包,那麼就會在編譯時將它們依次匯入。一個被多個地方匯入的包只會被匯入一次。當一個包被匯入時,如果該包還匯入了其它的包,那麼會先將其它包匯入進來,然後再對這些包中的包級常數和變數進行初始化,接著執行init函數(如果有的話),依次類推。等所有被匯入的包都載入完畢了,就會開始對main包中的包級常數和變數進行初始化,然後執行main包中的init函數(如果存在的話),最後執行main函數。
包在匯入時,查詢依賴時根據從高到低的優先順序來劃分,大概:

  • 當前包下的vendor目錄。
  • 向上級目錄查詢,直到找到src下的vendor目錄。
  • 在GOPATH下面查詢依賴包。
  • 在GOROOT目錄下查詢

包匯入的語法

在寫Go程式碼的時候經常用到import這個命令用來匯入包檔案,看到的方式參考如下:

  • 常規匯入

import(
    "fmt"
)
登入後複製

然後在程式碼裡面可以通過如下的方式呼叫

fmt.Println("hello world")
登入後複製

上面這個fmt是Go語言的標準庫,他其實是去GOROOT下去載入該模組。

  • 點操作

import (
   . "fmt"
)
登入後複製

這個點操作的含義就是這個包匯入之後在你呼叫這個包的函數時,你可以省略字首的包名,也就是前面你呼叫的fmt.Println(「hello world」) 可以省略的寫成Println(「hello world」)。注意:該包內的函數不能與其重名。

  • 別名操作

import( f 「fmt」 )
登入後複製

別名操作顧名思義可以把包命名成另一個用起來容易記憶的名字,別名操作呼叫包函數時字首變成了重新命名的字首,即f.Println(「hello world」),通常為了解決匯入多個重名包的問題。

  • _操作

import (
    _ "github.com/go-sql-driver/mysql"
)
登入後複製

_操作其實只是引入該包但不使用,通常只為了執行該包中所有的init()函數,最常見的就是上面的mysql包。

【相關推薦:Go視訊教學、】

以上就是go語言必須有一個什麼包的詳細內容,更多請關注TW511.COM其它相關文章!