Go語言的文件名、標識符、關鍵字和包基礎教程
1、文件名、關鍵字與標識符
1.1、名稱與標識符
Go 語言中的源文件通常以 .go 為擴展名,并存儲在計算機上。這些文件的命名完全由小寫字母構成,例如 scanner.go。對于包含多個詞的文件名,通常使用下劃線 _ 來連接各部分,如 scanner_test.go,并且文件名中不會包含空格或其他特殊字符。
在 Go 語言的環(huán)境中,源文件的大小并沒有限制,一個文件可以包含從幾行到數(shù)千行的代碼。
在 Go 代碼中,幾乎所有的元素都需要用到名稱或標識符,而且這些標識符對大小寫敏感,這一點與 C 系列語言相似。有效的標識符應該以字母(支持任何 UTF-8 編碼的字符)或下劃線 _ 開頭,后接任意數(shù)量的字母、數(shù)字或下劃線,例如:X56、group1、_x23、i、??12。
不過,有些標識符是無效的,包括:
1ab:以數(shù)字開頭是不允許的。case:因為它是 Go 語言的關鍵字。a+b:包含運算符,這是不被允許的。
特別地,下劃線 _ 被稱為空白標識符,它在 Go 語言中有特殊用途??梢詫⑷魏晤愋偷闹蒂x給它,但賦值后的結果不會被使用,也不能通過它來進行進一步的變量賦值或計算。
此外,在 Go 代碼中,有時候你會遇到?jīng)]有明確名稱的變量、類型或方法,這些通常被稱為匿名變量。使用匿名變量可以在某些場景下提升代碼的靈活性,盡管它們不是編寫 Go 程序的必需元素。
1.2、關鍵字
Go 語言定義了 25 個關鍵字或保留字,這些關鍵字在編寫 Go 代碼時具有特殊的語義,不能用作標識符。這些關鍵字涵蓋了控制結構、數(shù)據(jù)類型定義、以及包的管理等多個方面。下面是 Go 語言中所有的關鍵字列表:
控制流關鍵字:
break: 用于中斷當前循環(huán);case: 在switch語句中,用于定義一個分支;continue: 跳過當前循環(huán)的剩余部分,繼續(xù)執(zhí)行下一次循環(huán);default: 在switch或select語句中,定義默認分支;defer: 延遲執(zhí)行一個函數(shù)直到包含它的函數(shù)執(zhí)行結束;else: 與if一起使用,定義一個條件不滿足時執(zhí)行的代碼塊;fallthrough: 在switch中強制執(zhí)行下一個case;for: 定義循環(huán);goto: 跳轉到指定的標簽;if: 條件語句;return: 從函數(shù)中返回值;select: 用于處理多個通道的接收操作;switch: 條件分支語句;
數(shù)據(jù)類型及結構關鍵字:
chan: 用于定義通道類型;const: 定義常量;func: 定義函數(shù);interface: 定義接口;map: 定義映射類型;package: 定義包名;range: 用于迭代數(shù)組、切片、字符串、映射或通道;struct: 定義結構體;type: 定義一個新的類型;var: 定義變量。
這些關鍵字是 Go 語言的基礎組成部分,理解它們的用途和語義對于編寫有效和高效的 Go 程序至關重要。
之所以刻意地將 Go 代碼中的關鍵字保持的這么少,是為了簡化在編譯過程第一步中的代碼解析。和其它語言一樣,關鍵字不能夠作標識符使用。
Go 語言除了有25個關鍵字外,還提供了36個預定義的標識符,這些包括了一系列基本數(shù)據(jù)類型的名稱和一些重要的內置函數(shù)。這些預定義標識符是 Go 語言標準庫的一部分,它們提供了操作基本數(shù)據(jù)類型和執(zhí)行關鍵操作的能力。
這里是 Go 語言中的 36 個預定義標識符:append、bool、byte、cap、close、complex、complex64、complex128、copy、false、float32、float64、imag、int、int8、int16、int32、int64、iota、len、make、new、nil、panic、print、println、real、recover、string、true、uint、uint8、uint16、uint32、uint64、uintptr。
1.3、符號
程序一般由關鍵字、常量、變量、運算符、類型和函數(shù)組成。
程序中可能會使用到這些分隔符:括號 (),中括號 [] 和大括號 {}。
程序中可能會使用到這些標點符號:.、,、;、: 和 …。
程序的代碼通過語句來實現(xiàn)結構化。每個語句不需要像 C 家族中的其它語言一樣以分號 ; 結尾,因為這些工作都將由 Go 編譯器自動完成。
如果你打算將多個語句寫在同一行,它們則必須使用 ; 人為區(qū)分,但在實際開發(fā)中我們并不鼓勵這種做法。
2、Go 包
2.1、Go 語言包的概念
包在 Go 語言中用于結構化代碼,類似于其他編程語言中的類庫或命名空間。每個 Go 源文件都屬于一個特定的包,并且一個包可以由多個 .go 擴展名的源文件組成。通常情況下,文件名和包名不相同。
在源文件的非注釋第一行,必須明確指出該文件屬于哪個包,例如 package main。package main 定義了一個可獨立執(zhí)行的程序,每個 Go 應用程序必須包含一個名為 main 的包。
盡管一個應用程序可能包含多個不同的包,但即使只使用 main 包,也不必將所有代碼寫在一個龐大的文件中??梢詫⒋a分散到幾個較小的文件中,每個文件的第一行使用 package main 表明它們都屬于 main 包。如果編譯的包名不是 main,如 pack1,則編譯產(chǎn)生的是 pack1.a 對象文件而不是可執(zhí)行程序。值得注意的是,所有包名應使用小寫字母。
2.2、Go 語言的標準庫
Go 語言的安裝包中包括了一個豐富的標準庫,這是一組預先編譯好的包,可以直接在你的程序中使用。標準庫的具體位置取決于操作系統(tǒng)和處理器架構。
例如,在 Windows 系統(tǒng)上,標準庫位于 Go 安裝根目錄下的 pkg\windows_386 子目錄中;在 Linux 系統(tǒng)上,如果是 64 位,則在 pkg\linux_amd64 子目錄中,32 位系統(tǒng)則在 linux_386 目錄中。通常情況下,標準庫存放在 $GOROOT/pkg/$GOOS_$GOARCH/ 目錄下。
標準庫中包含了許多實用的包,如 fmt 和 os。除了使用這些現(xiàn)成的包,你也可以創(chuàng)建自己的包以滿足特定的功能需求。
為了構建程序,所有相關的包和文件必須按照正確的順序編譯,這個順序通常由包的依賴關系決定。在 Go 語言中,屬于同一個包的所有源文件必須一起編譯,因為一個包在編譯時被視為一個單獨的編譯單元。按照慣例,每個目錄中通常只包含一個包,以保持結構的清晰和管理的簡單。
2.3、Go 語言包依賴與編譯策略
在 Go 語言的包模型中,對某個包進行更改或重新編譯后,所有引用該包的客戶端程序必須重新編譯,以確保所有的依賴都是最新的。Go 的編譯器采用了一種顯式依賴關系的機制,這種機制極大地加快了編譯速度。
編譯過程中,Go 編譯器從后綴名為 .o 的對象文件中提取傳遞依賴類型的信息。這意味著,編譯器在編譯一個文件時,只需引用直接依賴的 .o 文件,而不是所有相關的源文件。例如:
- 假設有三個文件:
A.go、B.go和C.go,其中A.go依賴于B.go,而B.go依賴于C.go。 - 編譯順序應為先編譯
C.go,再編譯B.go,最后編譯A.go。 - 在編譯
A.go時,編譯器只需讀取B.o文件。盡管B.go依賴C.go,編譯A.go并不直接需要C.o,因為所有必要的信息都已經(jīng)在B.o中。
這種編譯機制不僅簡化了依賴管理,也使得編譯大型項目更加高效。通過這種方式,Go 語言能夠提供快速的編譯速度,同時保持代碼的模塊化和高度組織化。
2.4、每一段代碼只會被編譯一次
一個 Go 程序是通過 import 關鍵字將一組包鏈接在一起。
import "fmt" 告訴 Go 編譯器這個程序需要使用 fmt 包(的函數(shù),或其他元素),fmt 包實現(xiàn)了格式化 IO(輸入/輸出)的函數(shù)。包名被封閉在半角雙引號 "" 中。如果你打算從已編譯的包中導入并加載公開聲明的方法,不需要插入已編譯包的源代碼。
如果需要多個包,它們可以被分別導入:
import "fmt" import "os"
或:
import "fmt"; import "os"
但是還有更短且更優(yōu)雅的方法(被稱為因式分解關鍵字,該方法同樣適用于 const、var 和 type 的聲明或定義):
import ( "fmt" "os" )
它甚至還可以更短的形式,但使用 gofmt 后將會被強制換行:
import ("fmt"; "os")
當你導入多個包時,最好按照字母順序排列包名,這樣做更加清晰易讀。
如果包名不是以 . 或 / 開頭,如 "fmt" 或者 "container/list",則 Go 會在全局文件進行查找;如果包名以 ./ 開頭,則 Go 會在相對目錄中查找;如果包名以 / 開頭(在 Windows 下也可以這樣使用),則會在系統(tǒng)的絕對路徑中查找。
導入包即等同于包含了這個包的所有的代碼對象。
除了符號 _,包中所有代碼對象的標識符必須是唯一的,以避免名稱沖突。但是相同的標識符可以在不同的包中使用,因為可以使用包名來區(qū)分它們。
包通過下面這個被編譯器強制執(zhí)行的規(guī)則來決定是否將自身的代碼對象暴露給外部文件:
2.5、Go 語言的標識符可見性與包管理
在 Go 語言中,標識符(包括常量、變量、類型、函數(shù)名、結構字段等)的首字母大小寫決定了其可見性和可訪問性。如果標識符以大寫字母開頭(如 Group1),則該標識符的對象可以被外部包訪問,這相當于其他面向對象語言中的 public。這種機制被稱為導出。值得注意的是,大寫字母可以是任何 Unicode 編碼的字符,不限于 ASCII 碼。
相反,如果標識符以小寫字母開頭,則它對包外是不可見的,類似于面向對象語言中的 private。這種標識符僅在其所屬的包內部可見并可用。
例如,假設在包 pack1 中有一個變量或函數(shù)名為 Thing(以大寫 T 開頭,因此可被導出),在其他包中通過導入 pack1 可以訪問 Thing,使用方式如下:pack1.Thing。在這里,pack1 作為命名空間,是不可以省略的。
包的這種命名空間功能有助于避免名稱沖突。例如,pack1.Thing 和 pack2.Thing 可以清晰地區(qū)分屬于不同包的同名變量或函數(shù)。
2.6、使用包的別名
在 Go 中,你可以通過為包指定別名來解決包名沖突或簡化代碼。例如,你可以這樣導入 fmt 包并為其設置別名:
package main
import fm "fmt"
func main() {
fm.Println("hello, world")
}
2.7、包的聲明和初始化
在 Go 中,你可以在導入包之后,在包級別定義或聲明常量(const)、變量(var)和類型(type)。這些定義的作用域是全局的,可在整個包中被訪問。之后,可以聲明一個或多個函數(shù)(func)來進行具體的邏輯操作。這樣的結構使得代碼既清晰又易于管理。
Ps:如果你導入了一個包卻沒有在代碼中使用它,Go 編譯器會拋出錯誤,例如 imported and not used: os。這反映了 Go 的設計哲學:“沒有不必要的代碼!”
總結
到此這篇關于Go語言的文件名、標識符、關鍵字和包的文章就介紹到這了,更多相關Go語言文件名、標識符、關鍵字和包內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang?實現(xiàn)Redis?協(xié)議解析器的解決方案
這篇文章主要介紹了Golang???實現(xiàn)?Redis?協(xié)議解析器,本文將分別介紹Redis 通信協(xié)議 以及 協(xié)議解析器 的實現(xiàn),若您對協(xié)議有所了解可以直接閱讀協(xié)議解析器部分,需要的朋友可以參考下2022-10-10
解決Golang小數(shù)float64在實際工程中加減乘除的精度問題
這篇文章主要介紹了解決Golang小數(shù)float64在實際工程中加減乘除的精度問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

