Go語言的代碼通過包(package
)組織,包類似於其他語言里的庫(libraries
)或者模塊(modules
)。一個包由位於單個目錄下的一個或多個go源文件組成,目錄定義包的作用。每個源文件都以一條package聲明語句開始,例如package main
,表示該文件屬於main包,緊跟着一系列導入(import
)的包,之后是存儲在這個文件里的程序語句。
Go的標准庫提供了100多個包,以支持常見功能,入輸入、輸出、排序以及文本處理。比如fmt
包,就含有格式化輸出、接收輸入的函數。Println
是其中一個基礎函數,可以打印以空格間隔的一個或多個值,在最后添加一個換行符,從而輸出一整行。
main
包比較特殊。它定義了一個獨立可執行程序,而不是一個庫。在main
包里的main
函數也很特殊,它是整個程序執行時的入口(C系語言差不多都這樣)。main
函數所做的事情就是程序做的。當然了,main
函數一般調用其他包里的函數完成很多工作,比如,fmt.Println
。
總結一下就是,Go可執行程序可以分解成一個個包,其中必須存在main
包,main
包里必須包含main
函數,程序執行本質上就是運行main
包里的main
函數,main
函數結束程序就結束,就這樣。
main 函數和 init 函數
Go里面有兩個保留的函數: init 函數(能夠應用於所有的 package )和 main 函數(只能應用於 package main )。
這兩個函數在定義時不能有任何的參數和返回值。雖然一個 package 里面可以寫任意多個 init 函數,但這無論是對
於可讀性還是以后的可維護性來說,我們都強烈建議用戶在一個 package 中每個文件只寫一個 init 函數。
Go程序會自動調用 init() 和 main() ,所以你不需要在任何地方調用這兩個函數。每個 package 中的 init 函數都是可選的,但 package main 就必須包含一個 main 函數。
程序的初始化和執行都起始於 main 包。如果 main 包還導入了其它的包,那么就會在編譯時將它們依次導入。有時一個包會被多個包同時導入,那么它只會被導入一次(例如很多包可能都會用到 fmt 包,但它只會被導入一次,因為沒有必要導入多次)。當一個包被導入時,如果該包還導入了其它的包,那么會先將其它包導入進來,然后再對這些包中的包級常量和變量進行初始化,接着執行 init 函數(如果有的話),依次類推。等所有被導入的包都加載完畢了,就會開始對 main 包中的包級常量和變量進行初始化,然后執行 main 包中的 init 函數(如果存在的話),最后執行 main 函數。
1.Go中main函數不支持任何返回值
2.可以通過os.Exit(0)來返回狀態
func main(){ fmt.Println("hellow world") os.Exit(0) }
3.main函數不支持傳入參數
4.在程序中可通過os.Args來獲取命令行參數
func main(){ if len(os.Args) > 1{ //判斷命令行參數數組長度是否大於1,輸出命令行參數
fmt.Println(os.Args[1]) } fmt.Println("hellow world") }
//執行
go run main.go hahaha
//最終結果
hahaha
hellow world
