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ù)類型的名稱和一些重要的內(nèi)置函數(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
。這種標識符僅在其所屬的包內(nèi)部可見并可用。
例如,假設在包 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語言文件名、標識符、關鍵字和包內(nèi)容請搜索腳本之家以前的文章或繼續(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