---
# System prepended metadata

title: 'Day 3 : Golang Package'
tags: [About Go]

---

# Day 3 : Golang Package

今天複習最基本的Golang程式碼啟動的特性，首先撰寫Hello world，並透過五個小段落來瞭解go程式碼如何啟動。首先在VS Code新增一個main.go檔案，然後輸入以下程式碼
```go!
package main

import "fmt"


func main() {
    fmt.Println("Hello, World")

}
```

## 如何執行
在介紹如何執行之前，要先瞭解一些基本的go command
|  Command   |                      Action                       |
|:----------:|:-------------------------------------------------:|
|  go build  |          **編譯**一個以上的go code files          |
|   go run   |       **編譯並執行**一個以上的go code files       |
|   go fmt   |                 自動格式化該檔案                  |
| go install | 編譯並下載該package及與該package依賴的其他package，並安裝到 $GOPATH/bin 或 $GOBIN 目錄下 |
|   go get   |           下載其他開發者所撰寫的package           |
|  go test   |             執行該專案有撰寫的測試檔              |


簡單來說，執行的方式有兩種
* 在terminal輸入`go run main.go`，透過執行go指令來執行和編譯我們的go程式碼。
* 先編譯成可執行檔再來執行。在Go語言中可以透過`go build`編譯出跨平台的執行檔案。其所得到的檔案在Windows系統為.exe檔案，在Linux環境中則不會有附檔名。在此我們執行 `go build main.go`，就會得到一個main.exe的檔案，並可以透過./main啟動該執行檔案。
    
## Package main?
在Go裡面，package可以看做是個許多程式檔案的集合，就像是一個工作區域，裡面可以有很多go file。唯一的要求是每個go file，都必須在第一行聲明所屬的package是哪個。

那為什麼又要稱為main呢，在Go裡面有兩種packages
* Executable
  在編譯的時候產生一個**實際可運行的檔案**，就像當我們執行`go build main.go`，就會產生個可以實際執行的exe檔案。而<span style="color:red;"> package main</span> 就是指可執行的檔案。
* Reusable
  就像是「libraries」，並不是用來執行的，其裡面會有很多可重複使用的邏輯運算，幫助我們或是他人可以重複使用函式。

包含package main的go file，透過`go build`指令後，該編譯後的檔案main.exe，如果被執行時，main()函式就會自動被執行。而如果命名為其他package名稱，例如package hello(如下)，儘管執行`go build`，也不會產生任何可執行檔案。

```go!
package hello

import "fmt"

func main() {
    fmt.Println("Hello, World")

}
```

## import fmt ?
fmt package可以用來輸出許多不同格式的訊息，就像是JS的console.log和Python的print()，在進行debug非常好用。
在一個Go的開發項目裡，除了最主要的 package main，還會用到許多其他package，像是fmt, io,encoding等等，但在package main裡面是不能使用其他package定義的函式的，如果要使用，就要透過import，讓不同的package可以建立連結。
這裡是go在安裝時的[標準庫](https://pkg.go.dev/std)



 ## Conclusion
 最後的func，就是Day2提到的函式的宣告。因此統整一下，今天這串hello world的程式碼總共依序做了三件事。
 1. package declaration
 2. import other packages that we need
 3. declare function, tell Go to do things
  

## References
1. https://ithelp.ithome.com.tw/articles/10260277


###### tags: `About Go`
