[Golang] Go Cloud Functions and Go module

Visarut Junsone
Lazy-Dev
Published in
3 min readMar 30, 2019

Hello Go! จากที่ผ่านมาเราได้ลองทำการ Deploy web ขึ้น firebase ไป Click here ทำให้มานึกขึ้นได้ว่า เออ หน้าเว็บบางอย่างเราก็อาจจะอยากยิง API เรียกข้อมูลก็ได้นี้หว่า แต่เราก็มาคิดว่ามันมีวิธีที่ง่ายกว่านี้ไหมที่จะต้องมานั่งสร้าง route API นู่นนั่นนี่ แบบที่เคยทำ Click here แล้วเอา deploy สักทีนึง มันต้องมีวิธีที่ง่ายกว่านั้นสิ แล้วเราก็เจอจนได้ นั้นก็คือการใช้ Cloud Function ของ Firebase นั้นเอง

Let’s Get Start

ต้องลง SDK กันก่อน ไปที่นี้เลย Google Cloud พอดีผม Golang บน window ก็จะพาทำแบบ window นะ

รูปที่ 1 แสดงรายละเอียดการติดตั้ง

ก็กด Download คลิกๆๆๆๆ Nextๆๆๆๆๆ finish ไปเลย

รูปที่ 2 แสดงการติดตั้ง
รูปที่ 3 แสดงการติดตั้ง

จะเห็นว่ารูปที่ 3 ผมเลือกให้ Start Google Cloud SDK Shell ด้วย เสร็จแล้วมันจะเปิดขึ้นมาพาทำการ log in ต่างๆ ขอ permission access ของ google เสร็จแล้วก็เลือก Project ที่เราสร้างไว้ใน firebase ซะ

รูปที่ 4 เลือก Project

นั้นละ เท่านี้เราก็เชื่อมต่อกับ firebase เรียบร้อยละ พร้อมไปสูขั้นตอนการเขียนโค้ดเพื่อนำไป deploy

Go module

แต่ก่อนที่เราจะเริ่มไปเขียนโค้ดเราต้องมาทำความเข้าใจเรื่อง Go module ซะก่อน โดยจะพูดเป็นสรุปง่ายๆ เป็น Feature ใน go version 1.11 ที่สามารถทำให้เราเขียน golang แล้ว build หรือ run code ได้ โดยไม่ต้องวางไว้ใน Workspace ($GOPATH/src ← ภายในนี้คือ workspace)

แล้วมันทำยังไงละ ง่ายๆ ครับ

  1. สร้าง folder นอก workspace ขึ้นมา
  2. สร้างไฟล์ go ขึ้นมา เขียนโค้ดลงไป
  3. เปิด command line ใน directory นั้น และทำคำสั่ง go mod init <ชื่อไฟล์>
รูปที่ 5 ทดสอบการสร้าง go module

จะได้ไฟล์ go.mod มา ในกรณีที่เราใช้ package อื่นนอกpackage มาตรฐานด้วย เราจะได้ไฟล์ go.sum มาด้วย

รูปที่ 6 ทดสอบกรณีในได้ไฟล์ go.sum

แล้วไอเจ้า go.mod และ go.sum มันมีประโยชน์ยังไงละ ทำไมถึงต้องเอามาอธิบายก่อน deploy ขึ้น Cloud function ของ firebase

  1. go.mod ตัวนี้จะทำหน้าที่ในการ go get พวก external dependencies (พูดง่ายๆคือ package อื่นๆ ที่ไม่ใช้ package พื้นฐานที่ go มีมาให้ตอนแรก) เพราะว่าเราเขียน go ด้านนอก Workspace ไงละ และมันจะ get external dependencies ไปด้วยตอนเรา deploy ขึ้น Cloud function ของ firebase (ถ้าในกรณีที่ไม่ได้ใช้ package อื่นๆ ก็ยังคง deploy ได้เหมือนเดิมนะ)
  2. go.sum ส่วนเจ้าตัวนี้เนี่ยมันจะประกอบไปด้วย version ของ package และ checksum ของ dependencies ทั้งหมด และเอาไว้ให้ Module authenticate การ download module นั้นๆ มาด้วย อ่านเพิ่มเติมได้ที่ → Click here

เสริม สามารถใช้คำสั่ง go mod tidy เพื่อ เอา unused package ออกไป

Deploy to Cloud function

กลับมาสู่เรื่องของการ deploy เราจะต้องเขียน Function ที่มี parameter สองตัว ซึ่งคือ w http.ResponseWriter และ r *http.Request

package test
import (
"encoding/json"
"net/http"
)
// Response is an object for response api
type Response struct {
Code int64
Message string
}
func GetHelloWorld(w http.ResponseWriter, r *http.Request) { response := Response{ Code: 200, Message: "Hello World!...", } w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(response)}

รันคำสั่งให้เรียบร้อย

go mod init <ชื่อไฟล์>
go mod tidy

และเมื่อจะ deploy ให้รันคำสั่ง

gcloud functions deploy <ชื่อโฟล์เดอร์> --runtime go111 --entry-point <ชื่อฟังก์ชั่น> --trigger-http
รูปที่ 7 แสดงผลลัพท์

จะเห็นว่าเราได้ลิ้งค์เรียกฟังก์ชั่นนั้นมาแล้ว

รูปที่ 8 ลองเรียก

เมื่อเราเรียกก็จะได้ผลลัพท์ตามที่เรากำหนดไว้

จบแล้ว ง่ายไหมครับ ไม่มีอะไรจะพูดแล้ว ครั้งหน้า จะมาเขียนอะไรดีนะ สวัสดี

--

--

Visarut Junsone
Lazy-Dev

I’m Full-Stack Developer. ReactJS Golang C# Javascript C++ PHP and learning a lot more. Not lazy as it name. “Lazy-Dev”