# Day04 寫程式之前,GO這些很重要 要注意的是,因為Go語言很新,比你我年紀都還小(應該吧?) 每次推新的版本時,很常出現實驗性的功能、套件。 例如: `v1.5`版本時推出`Vendor`套件 來管理套件 `v1.11`版本出現`Go Modules(Go Mod)` 方式來管理套件 所以在網路上尋找解答時,一定要注意該篇文章用的是哪個版本。 ###### (初學、第一次看 不一定馬上懂,寫過一些小程式回過頭再看一次更有感覺) ### 比寫程式還重要的事 * 一個`專案(Project)`可以由多個`包(Package)`組成 * 一個`包(Package)`可以有多支`程式(.go file)` * 同一個`包(Package)`底下的`程式(.go file)`彼此全域變數及函式可以互見,就像在同一支程式裡一樣 * `包(Package)`的名稱 為包所在的`資料夾名稱` * 一個`程式(.go fle)`只能屬於一個`包(Package)` * 一個`程式(.go fle)`可以有多個`變數、函式(function)` * `程式(.go file)`的名稱 不一定要等同於資料夾或`包(Package)`的名稱 * 一個專案中一定會有一支(或多支)`主程式(package main)` * `主程式(package main)`代表我們可以主動 `go run 執行`這包程式 * 主程式裡面一定要有 1. `package main` 2. `func main()` * `func main(){}`就是執行專案時程式的進入點 > 簡單來說, > **Project(專案) > Package(程式包) > .go file(程式檔) > Function(函式)** >> 一個子資料夾內的程式都是同一個Package >> 同一個Package都在同一個子資料夾內 >> 同一個資料夾(Package)內的函式、結構及變數互通 > > 當然你不要這樣放(有些情況)也是可以,但是慣例、官方範例、各大套件都是這樣放 * 變數、函式、結構**大寫開頭**代表對外暴露,就是**Public**啦 * 也就是說小寫開頭為Private * 換個角度想,func main()、func init()(之後會看到) 都是在**這個當前的Package**裡執行,所以會是小寫啦。 ### 本宅心法傳授(好噁?!) 之前在學習其他程式語言階段,都是直接上網Google用法,搜尋結果出來中英文的教學都有,但當然有中文就看中文。 但在開始碰Go之後,用到的任何函式、Github上的套件、基本上就是看官方文件了,尤其`README.md`一定要看,通常會有安裝步驟及套件基本用法。 因為等到有中文翻譯可能是兩三個月之後,而屆時的版本可能又有更動, 且網路上的教學不一定正確,官方的文件比較可靠(...官方文件也不一定百分之百正確,之前就有用過 程式碼更新、文檔或範例程式卻沒有一併更新的) 連官方文件都不一定可靠,那該怎麼辦? 別擔心,這種狀況少之又少,但100%可靠的是 直接`Trace Source Code`,看套件程式怎麼寫、就怎麼套著用。 甚至有時候直接看程式碼、比落落長的文字敘述,表達的意思還要更佳流暢。 這也是推薦使用`Goland IDE`的主要原因之一,對著程式碼的語法按下`Command+左鍵`(或`Ctrl+左鍵`)就能追蹤這個用法的來源程式哩。