GoLang - 語言基礎 介紹與基本結構
在這幾篇,會以 Go 語言的入門基礎進行逐步說明,本篇針對 介紹及基本結構 進行說明
Go 是現代化、速度相當快且擁有豐富的標準庫 透過 goroutine 併發非常有效率,單一線程可以執行多個 goroutine。 在設計併發架構最困難的部分在於如何確保多個併發進程、線程及groutine 不會同時針對同一資料進行操作。透過 Go 可以簡單地實現併發過程數據一致性。 Go 提倡組合(composition),而不是傳統繼承方式;因此,可直接多個類型組合成類型,並且引用這個類型就能使用整個組合的功能。 Go 在內存管理也處理得相當好,使用現代化的回收機制。
這裡記錄一些 Go學習初期的紀錄,提供參考。
練習過程可以試著透過 Go Playground 網頁編譯 Go : https://play.golang.org/
注意,底下範例主要在說明功能,可能會略過 package 或 main 等描述!!
常用命令
在建構 go 過程中,常使用到的命令包括:
- go build : 打包package,會聯同編譯關聯的內容(會忽略 _ 或 . 開頭的go文件)
- go run : 編譯及運行 go,但不會產生執行檔
- go clean : 移除打包的 package
- go fmt : 代碼風格自動格式化
- go get : 取得遠程代碼並且安裝
- go test : 自動運行 *_test.go 的文件,並且產生執行檔
其他常用輔助查詢的命令包括:
- go fix : 修復舊版本的程式碼為新版本
- go version : 查詢目前版本
- go env : 查詢環境變數
- go list : 列出目前安裝的 package
- go help : 取得幫助
main 與 init
Go 預設有兩個保留函式: init() 與 main()。在 Go 程序執行過程會自動調用這兩者,這兩個函式主要負責執行內容,並且不能返回值。
在接續會提到的 package ,多數都會在最後執行一次 inti(),並且,在主要的程序中,也可以使用 init() 執行動作。
最後,才會執行 main()。
整體而言,在主要程序中,main 主要負責執行初始化程式,大多程式執行入口都由 main() 負責運作。
基本組成 - Package
Go 是由 Package 所組成,其中包括 main package 以及預設執行的 main() 函式。以及每個 package 都會預設初始化一段init()
Go 的 package 載入相當有效率,每一個 package 無論被 import 多少次,整體程序都只會一次載入。
載入 package 的方式如下,可以透過 ```import``
CVT2HUGO: 來載入 package
import {package名稱}
例如
package main
import "fmt"
import "math"
當有多個 package 需要載入,可以用刮號() 來包住
package main
import (
"fmt"
"math"
)
import 也可以載入遠端的package 例如:
import "github.com/spf13/viper"
輸出字串
由 Go 一開始的範例都會輸出一段 Hello world
輸出字串的方式是透過 fmt package 的方法來實作
package main
import (
"fmt"
"math"
)
func main(){
fmt.Printf("輸出一行文字但不換行")
fmt.Println("輸出一段文字並且換行")
}
型別
Go 的型別主要有以下幾種
布林
bool
字串
string
整數
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
位元
byte // uint8 的別名
Unicode碼
rune // int32 的別名
浮點數
float32 float64
複數
complex64 complex128
變數
透過 var
CVT2HUGO: 可以用來定義變數,並且可以指定型別
var a int
var b sting
var c bool
可以同時將多組同型別的變數在最後變數進行一次定義
var a, b, c int
此外,也可忽略型別,直接由表達式取得型別
var a, b, c = 1, true, "Hello"
如果在函式內部(注意!只能函式內部)可以使用 := 來取代 var
func main(){
a := "hi"
fmt.Println(a)
}
輸出取代字元
fmt.Println 或 fmt.Printf 輸出時,都可以用取代字元
var name = "adam"
var age = 30
fmt.Printf("Your name is %s and age %d\n", name, age)
相關取代字元可以參考 fmt package 說明 https://golang.org/pkg/fm
輸出串接字串、數字
透過 fmt.Sprintf
CVT2HUGO: 來串接內容
package main
import "fmt"
type UserData struct {
name string
age int
}
func User(row UserData) string {
return fmt.Sprintf("Your name is %s and age is %d", row.name, row.age)
}
func main() {
a := UserData{"adam", 10}
fmt.Printf(User(a))
}