iT邦幫忙

2021 iThome 鐵人賽

DAY 3
0
Modern Web

fmt.Println("從零開始的Golang生活")系列 第 3

Day3 First Go application

前言

前面的章節可以建議使用線上IDE進行練習與熟悉。

線上 Go IDE的網址在下方

https://play.golang.org/

始於Hello World

無論是從終端機touch或是用goland新增,請產生一個名為hello.go的檔案並輸入以下內容:

package main

import "fmt"

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

對於簡短的程式碼,可用go run指令執行!

go run hello.go
Hello World

較為複雜的程式碼,則需要先進行指令編譯成執行檔在執行:

go build hello.go
$ ./hello
Hello World

程式碼解說

我們再重新看一次程式碼,並配合註解服用:

// Set current package
package main

// Import some package
import "fmt"

// Enter main function
func main() {
	// Print out string "Hello World" on stand output.
	fmt.Println("Hello World")
}

  • package: 當前的package,若package為main則代表當前檔案為主執行檔。
  • import: 指該程式碼內有被引用的package,與其他程式語言不同的是,若在Go中import一個未被使用的package,則會報錯。
  • func main: 主函式,何謂主函式我們會在下個段落仔細解說。

主函式 Main Function

  1. 主函式是一個特殊的函式,用於應用程式的起始點或是進入點。
  2. 每個GO應用程式只會有一個主函式,且由於主函式寫法是固定的,讀者不必擔心不會寫主函式,將主函式當成制式的模板程式碼即可。
  3. 當專案規模小時,可以將程式碼都放置在主函式之中,但隨著專案規模擴大,我們需要將程式碼依照重複性以及功能性切畫出來。

下方我們將原本的 Hello World 程式改寫如下:

// Set current package
package main

// Import some package
import "fmt"

// Enter main function
func main() {
	sayHello()
}

// Write down Hello World function
func sayHello() {
	// Print out string "Hello World" on stand output.
	fmt.Println("Hello World")
}

Package說明

我們找到Println的說明(command + 左鍵點選指定函式),可以看到Println的公開介面如下:

func Println(a ...interface{}) (n int, err error) {
	return Fprintln(os.Stdout, a...)
}

由這個公開界面可知,Println接收任意數量的參數,參數為任意型別 (interface{})。該函式會回傳兩個參數,分別是整數 nerr 物件n 表示寫入的字串長度而 err 回傳錯誤物件,當程式沒有發生錯誤時,err 為空值nil。

我們的範例程式中,我們知道程式不會發生錯誤,而且也不需要知道字串的長度,故我們忽略程式的回傳值。

Go的一些小常識

  • 一個專案(Project)可以由N個包(Package)組成
  • 一個包(Package)可以有N支程式(.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(函式)

然後他們也有公認的命名方式:

  • 變數、函式、結構大寫開頭代表對外暴露,就是Public
  • 也就是說小寫開頭為Private
  • 換個角度想,func main()、func init()(之後會看到) 都是在這個當前的Package裡執行,所以會是小寫啦。

GO folder structure

GOROOT放的是安裝的go語言、官方內建的函式庫。

例如經常使用到的fmt就是放在此

import "fmt"

GOPATH則是放別人開發的第三方套件、以及自己的程式碼

import "github.com...(別人的repository)"

這兩點應該前個章節已經提及,但因為頗為重要所以在提醒一次。

照慣例通常會把自己寫的專案及程式放入GOPATH底下的**src(source)**資料夾裡,如果有用Github會再多一層 github.com 及 account。

以上的分法都通常是在較久遠的年代,透過glide或dep來管理。自從Go 1.11 推出了gomod後,就不一定要把專案放到GOPATH底下,也可以正常運行但這邊還是偏向使用GOPATH及glide套件管理工具

GOPATH目錄架構

使用者目錄 (C:\Users\USER 或 ~/) 

- Go (GOPATH) 如果底下沒有bin/pkg/src目錄,別擔心,自己新增一個

- bin (放編譯過後的可執行檔案 二進制檔案)

- pkg (放編譯過後的library)

- src (放原始碼 Source Code)

    - [github.com](http://github.com/)

        - Jack (使用者名稱)

            -JackProject (專案名稱)

                - main.go (主程式)

        - Tom

            -TomProject

                - core (函式庫名稱)

                    - core.go

                - libs (函式庫名稱)

                    - lib.go

                - main.go

        - [gitlab.com](http://gitlab.com/)

Summary

這章節主要讓大家撰寫第一個Go Application,並告訴大家程式擺放的目錄架構、基本Go程式的知識點等,在下個章節則會帶大家進入變數的世界。


上一篇
Day2 Develop Environment For Go
下一篇
Day4 Variable
系列文
fmt.Println("從零開始的Golang生活")30

尚未有邦友留言

立即登入留言