跳到主要內容

發表文章

目前顯示的是有「go lang」標籤的文章

Golang 的物件導向: Golang Object Oriented Programming

前言 Go 不是一個典型的物件導向程式語言 (Object Oriented Programming, OOP), 所謂的 OOP 三大精神 "封裝", "繼承",  與 "多形" 在Go語言中其實並沒有被完整的實現,  取而代之的是以結構來代替類別, 以組合來代替繼承, 以及介面實作來達到多形 結構與類別的差異 Go 允許將相關的資料組織在同一個結構 (struct) 裡, 甚至還可以為其定義方法, 這個作法跟其他 OOP  語言 (如 C# ) 將資料封裝在類別裡的概念很像 type User struct { Hight int Weight int Name string } func (p * User) GetBMI() int { return p.Weight / p. Hight * p. Hight } 差別是結構沒有建構子可以用, 所以通常是要自己寫一個 New_ _ _( ) 的函式來實現相關的初始化的動作 func NewUser(h, w int, name string) *User{ p:= &Page{Hight: h, Weight: w} if name == "" { p.Name = "Unknown" // set default value } return p } 組合 Composition Go 沒有繼承, 若想要重用程式碼必須以 has-a 的方式將其他結構的資料嵌入 (Type Embedding) type BusinessUser struct { User // <------------------ type embedding CreditCarNumber string } func NewBusinessUser(h, w int, name, cred string) *User{ if cred == "" { return nil } p:= &Bus...

Create a new instance of a struct from its type in go

前言 為了讓程式更有彈性, 在某些情況下會需要在 runtime 的時候建立 struct 的實例, 透過使用 Go Lang 內建的 reflect 套件, 就可以輕鬆地動態產生實例並且賦值 以實作一個Copy的函式為例 func Copy(i interface{}) interface{}{ objType := reflect.TypeOf(i) objVal := reflect.ValueOf(i) newObjValPtr := reflect.New(objType) newObjValPtr.Elem().Set(objVal) return newObjValPtr.Elem().Interface() } 首先呼叫 reflect.TypeOf 取得某個型態的相關結構資訊 objType := reflect.TypeOf(i) Note 以Go Lang的設計原則來說, 每個變數都會有一組資訊用來記錄值以及型態的資訊 (value, type ) 接著呼叫 reflect.ValueOf 傳回一個 Value 的實例 (Value 是定義在 reflect 套件裡的結構, 提供了一些方法可以取得實際的值) objVal := reflect.ValueOf(i) 接下來傳遞型態資訊給 reflect.New 來產生一個空的 Value 實例 newObjValPtr := reflect.New(objType) 實際上 reflect.New 並不是直接回傳空的 Value 實例, 而是回傳一個實際值為指向空 Value 的指標的 Value 實例 若要對這個空 Value 賦值, 必須使用 .Elem 取得 newObjValPtr 的實際值指向的本體後, 才能以 .Set 賦值 newObjValPtr.Elem().Set(objVal) Note Value的值若是一個指標, 必須 透過 Elem() 方法才能取得目標值 最後再用 .Interface 以 Interface{}的形態輸出 newObjValPtr .Elem().Interface() 實驗1. fu...

如何在Google App Engine(GAE)上部屬Go應用程式: Deploying your Go app on Google App Engine

前言 話說 Google 推行 App Engine 已經有好一陣子了, 就算後來 GCP 的光芒幾乎都聚焦在其他產品上如 Kubernetes Engine, 但直至今日還是有很多死忠的開發者喜歡使用 App Engine 這項服務, 對於不想花時間搞底層環境的人來說, 將服務部屬在這兒絕對是最佳的選擇 以下簡單的介紹如何在 Google App Engine(GAE) 上部屬Go程式 首先, 設定環境 需要在開發的環境裡安裝 glcoud 的 SDK 並且初始化某些設定 gcloud init 或是, 直接打開 CloudShell 直接在上面敲 gcloud 的指令也可以 (但最後部屬時需要把程式碼 clone 到 CloudShell 的機器裡) Step 1. 建立App.yaml 在工作目錄中建立 App.yaml 來描述部署的環境, 如下所示 在 App.yaml 裡面可以定義 Runtime, Service Name, 以及程式中會用到的 Environment Variable 等等 ex: runtime: go env: flex service: my-server env_variables: RUNMODE: stage automatic_scaling: min_num_instances: 1 max_num_instances: 1 cool_down_period_sec: 120 # default value cpu_utilization: target_utilization: 0.7 resources: cpu: 1 memory_gb: 5 disk_size_gb: 10 volumes: - name: ramdisk1 volume_type: tmpfs size_gb: 0.5 App.yaml 裡有一個欄位 env 可以用來指定即將部屬的環境 env: flex 這邊要注意的是 GAE 提供兩種不同的部屬環境 Standard 以及 Flexible 可以選擇 Standard V.S Flexible Environment ...

如何使用Go語言實作RSETful Server: Creating a RESTful API With Golang

前言 要使用Go建立一個RESTful的Web Server非常地簡單, 只要使用內建的模組net/http就能輕易達成 首先, 匯入相關套件 package main import ( "encoding/json" "net/http" ) 添加兩個路由"/", "/users", 以及實作兩個handler來處理對應的請求 func handler(w http.ResponseWriter, request *http.Request) { w.Write([]byte("Hello world.")) } func usersHandler(w http.ResponseWriter, request *http.Request) { data := make(map[string]interface{}) data["users"] = []interface{}{ map[string]interface{}{ "name": "andy", "pwd": "123456", }, } jsonByte, _ := json.Marshal(data) w.Header().Set("Content-Type", "application/json") w.Write(jsonByte) } func main() { http.HandleFunc("/", handler) http.HandleFunc("/users", usersHandler) ... 給定要聽的port http.ListenAndServe(":3000", nil) 測試 localhost:3000  測試localhost:3000/users...