GoLang - 語言基礎 介紹與基本結構

Golang - 語言基礎 Slice

在這幾篇,會以 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))
}