บันทึกการเรียน Golang - วันที่ 5 - อ่าน A Tour of Go (ต่อ)
วันนี้วันที่ 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
หมายถึง จำนวน arrayn
ตัว แบบชนิดตัวแปร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 ❤️