---
# System prepended metadata

title: Day04 寫程式之前，GO這些很重要

---

# 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+左鍵`)就能追蹤這個用法的來源程式哩。 
