บันทึกการเรียน Golang - วันที่ 5 - อ่าน A Tour of Go (ต่อ)

Go Sep 2, 2023

วันนี้วันที่ 5 ขอกลับไปอ่านพื้นฐาน A Tour of Go ให้จบก่อน วันนี้ก็เลยอ่านพวก Flow Control, Statement, types, method ต่างๆ จริงๆ อาจจะไม่ได้ลงลึกอะไรมากมาย แค่ลองอ่าน และเปรียบเทียบกับภาษา JavaScript/TypeScript ที่ใช้อยู่ประจำ

Pointers, Structs, and Maps

  • มี pointer เหมือน C/C++ รูปแบบ syntax ก็ไม่ต่างกัน คือ *T ชี้ไปที่ ค่า T มีต่างตรงที่ pointer ของ Golang ไม่มี การ เพิ่ม ลบ pointer
var p *int

i := 42
p = &i
  • Structs เหมือนกับหลายๆ ภาษา เข้าถึง struct field ด้วยการใช้ dot (.)
  • Array มี syntax คือ [n]T หมายถึง จำนวน array n ตัว แบบชนิดตัวแปร T
// สร้าง array แบบ integer 10 ตัว
var a [10]int

primes := [6]int{2, 3, 5, 7, 11, 13}
  • Array มีขนาดเป็น fixed size คือขนาดตายตัวตอนเรา initial แต่ว่า Slice เป็น dynmaic size หน้าตา slice เป็นแบบนี้
a[low: high]

// เช่น
primes := [6]int{2, 3, 5, 7, 11, 13}

var s []int = primes[1:4]
  • slice เป็น mutable data type ถ้าเปลี่ยนค่าของ slice ตัว original array ก็เปลี่ยนด้วย ดูตัวอย่าง
  • สร้าง slice ด้วย make (ผมเจอในหลายๆ Tutorial ที่อ่านมา เพิ่งรู้ว่ามันคือ slice นั่นเอง ฮ่าๆ)
a := make([]int, 5)

// a = [0 0 0 0 0] (len=5, cap=5)
  • append เอาไว้เพิ่มข้อมูลเข้าไปใน slice มีรูปแบบ syntax แบบนี้
func append(s []T, ...T) []T

// args ตัวแรก คือ slice ที่เราจะเพิ่ม ตัวสองคือ ค่าที่จะเพิ่มตั้งแต่ 1 หรือหลาย element ก็ได้
var s []int

s = append(s, 0)
s = append(s, 1, 2)
s = append(s, 3, 2, 1)
  • ใช้ range เพื่อวนลูป for (คล้ายๆ map ใน JavaScript เหมือนกันแฮะ) (i คือ index ส่วน v คือ value ใน slice)
package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
	for i, v := range pow {
		fmt.Printf("2**%d = %d\n", i, v)
	}
}
  • ตัว Exercise Slice มีคนทำตัวอย่าง ไว้ ค่อนข้าง creative มากๆ 🤣 https://gist.github.com/tetsuok/2280162
  • Map คล้ายๆ ในหลายภาษา เช่น ต้องการกำหนด map key string มีค่า int
var m map[string]int

m["a"] = 10
m["b"] = 20
  • การ mutate map ก็คือ assign ค่าใหม่ หรือลบด้วย delete(m, key)
  • Go มี closures เหมือนๆ (คล้ายๆ) กับ JavaScript และก็รองรับ annonymous function เหมือนๆกัน ข้อดีก็คงคล้ายๆกันมั้ง คือให้เรา define function แบบ inline โดยไม่ต้อง assign หรือตั้งชื่อตัวแปร (แต่ยังแอบงงๆ กับการมอง syntax closure function)
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}
  • เรื่อง methods คือ function ที่มี argument (หรือเรียกว่า receiver) ดู syntax ก็ยังแอบงงๆ อ่านยากอยู่ ตัว receiver อยู่ระหว่าง func กับชื่อ method
type Vertex struct {
	X, Y float64
}

// receiver คือ Vertex ชื่อ v
func (v Vertex) Abs() float64 {
	return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

ตอนนี้เริ่มงงๆกับ methods และ function แล้ว อ่านแล้ว แต่ยังไม่ค่อยเข้าใจจุดประสงค์ทำให้ต้องใช้ methods / receiver นะ? เดี๋ยวไว้มาต่อวันหลัง วันนี้อ่านไม่ไหวแล้ว สมองตามไม่ทัน 😅

Happy Coding ❤️

Tags

Chai Phonbopit

เป็น Web Dev ทำงานมา 10 ปีหน่อยๆ ด้วยภาษา JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจ Web3, Crypto และ Blockchain เขียนบล็อกที่ https://devahoy.com