avatar
thiti.dev
วงแหวนเว็บ
Search
Tags
My CV
Contact
Support me
Go EP.4 Syntax ของภาษา Go
31 Aug 2021

สวัสดีครับ ในบทความนี้ก็เป็น EP.4 แล้วนะครับ โดยเนื้อหาจะเป็นเรื่องเกี่ยวกับ Syntax ของภาษา Go ว่าภาษา Go มีรูปแบบการเขียนเป็นอย่างไร แต่ละคําสั่งใช้อย่างไร

สําหรับท่านใดที่ยังไม่ได้อ่าน EP.3 ท่านสามารถกลับไปอ่านก่อนได้นะครับที่นี่ Go EP.3 Go packages คืออะไร

มาเริ่มเรียนรู้ไปด้วยกันตามหัวข้อด้านล่างเลยครับ

Go Playground

ก่อนที่จะไปทําความเข้าใจกับ Syntax ของ Go ผมขอแนะนําเว็บสําหรับ Compile ภาษา Go แบบ Online ซึ่งจะทําให้เราสามารถเขียนภาษา Go และรันได้บนเว็บเลย จะเป็นเครื่องมือช่วยให้เราเรียนรู้ภาษา Go ได้ง่ายขึ้นครับ สามารถเข้าไปใช้งานได้ที่ https://play.golang.org/

Naming Convention

การตั้งชื่อของภาษา Go จะเน้น สั้น กระชับ และมองแล้วรู้เรื่องเลยว่าหมายถึงอะไร และไม่ควรตั้งชื่อซำ้กับ Reserved word หรือ คําสั่งต่างๆของระบบ เช่นพวก base64, int, if, else

การตั้งชื่อไฟล์

การตั้งชื่อไฟล์ในภาษา Go จะตั้งชื่อในรูปแบบ snake_case เช่น user_profile.go, book_store.go

การตั้งชื่อตัวแปร (Variable) และฟังก์ชัน (Function)

การตั้งชื่อไฟล์ในภาษา Go จะตั้งชื่อในรูปแบบ camelCase เช่น firstName, lastName

การประกาศตัวแปร (Variable)

การประกาศตัวแปรในภาษา Go นั้นสามารถทําได้หลายแบบ ลองมาดูตัวอย่างในแต่ละแบบกันเลยครับ

การประกาศตัวแปรแบบที่ 1

การประกาศตัวแปรแบบทั่วไป โดยภาษา Go นั้น การประกาศตัวแปรจะต้องกําหนด Type หรือประเภทของข้อมูลด้วย ตัวอย่างเช่น

// ประกาศตัวแปรแบบทั่วไป
var a string

// ประกาศตัวแปรหลายๆตัวพร้อมๆกัน โดยมี type เป็น string
var d, e, f string

// แบบนี้ก็ได้นะครับ
var (
    name    string
    city    string
    age     int
    married bool
)

// แบบนี้ก็ได้นะครับ
var (
    name, city string 
    age        int
    married    bool
)

การประกาศตัวแปรแบบที่ 2

ประกาศตัวแปรแบบกําหนดค่าให้กับตัวแปรนั้นๆเลย ซึ่งจะทําการกําหนด Type ของตัวแปรนั้นๆให้โดยอัตโนมัติตามข้อมูลที่เรากําหนด

// ประกาศตัวแปรโดยการกําหนดค่าให้กับตัวแปร ซึ่งในที่นี้ a จะมี type เป็น string
var a = "hello go"

// ประกาศตัวแปรหลายๆตัวพร้อมๆกัน โดยกําหนดค่าให้กับตัวแปรแต่ละตัวเป็นข้อมูลที่แตกต่างกันดังนี้
// d มีค่าเป็น true และจะมี type เป็น boolean
// e มีค่าเป็น 100 และจะมี type เป็น int
// d มีค่าเป็น "hello" และจะมี type เป็น string
var d, e, f = true, 100, "hello"

// แบบนี้ก็ได้นะครับ
var (
    name, city string = "David", "London"
    age int           = 40
    married bool      = true
)

// แบบนี้ก็ได้นะครับ
var (
    name, city = "David", "London"
    age        = 40
    married    = true
)

การประกาศตัวแปรแบบที่ 3

การประกาศตัวแปรแบสั้น (Shorthand) การประกาศตัวแปรแบบนี้จะเห็นบ่อยที่สุดครับ คือการตัดคําว่า var ออก แล้วเติม ":" ข้างหน้าเครื่องหมาย "=" มาดูตัวอย่างกัน

// ประกาศตัวแปรโดยการกําหนดค่าให้กับตัวแปร ซึ่งในที่นี้ a จะมี type เป็น string
a := "hello go"

// ประกาศตัวแปรหลายๆตัวพร้อมๆกัน โดยกําหนดค่าให้กับตัวแปรแต่ละตัวเป็นข้อมูลที่แตกต่างกันดังนี้
// d มีค่าเป็น true และจะมี type เป็น boolean
// e มีค่าเป็น 100 และจะมี type เป็น int
// d มีค่าเป็น "hello" และจะมี type เป็น string
d, e, f := true, 100, "hello"

ชนิดของตัวแปรที่ใช้กันบ่อยๆมีดังนี้ครับ

  • bool - ตัวแปรชนิด Boolean ค่า Default: false
  • int - ตัวแปรชนิด ตัวเลขจํานวนเต็ม ค่า Default: 0
  • float - ตัวแปรชนิด ตัวเลขที่เป็นทศนิยม ค่า Default: 0.0
  • string - ตัวแปรชนิด ตัวอักษร String ค่า Default: ""
  • function - ตัวแปรชนิด Function ค่า Default: nil (Null)

จริงๆ มีเยอะกว่านี้ครับ เดี่ยวผมจะมาเขียนเล่าให้ฟังอีกทีครับ

การสร้าง Function ในภาษา Go

สร้าง Function ทั่วๆไป

การสร้าง Function ใน ภาษา Go ก็เหมือนๆกับภาษาอื่นๆครับ โดย Go จะใช้คําว่า "func" นําหน้า Function ที่เราต้องการสร้าง ตามตัวอย่างนี้ครับ

func sayHello() {
     fmt.Println("Hello go");
}

ก็เท่านี้ครับไม่ยาก

ในภาษาโกจะมี Function พิเศษอยู่ Function นึง ชื่อว่า "main" ซึ่ง function นี้จะเป็น Function เริ่มต้นสําหรับ run ครับ จะเห็นว่าตัวอย่างในบทความก่อนหน้านี้จะมี Function main อยู่ ซึ่งเป็น Function แรกที่โปรแกรมจะวิ่งเข้าไปรันเมื่อเรารันโปรแกรมครับ

สร้าง Function แบบมีการรับ Parameter

การสร้าง Function โดยมีการรับ Parameter สามารถใส่ Parmeter เข้าไปได้เลยเหมือนภาษาอื่นๆ ตามตัวอย่างนี้ครับ

func sayHello(name string) {
  fmt.Println("Hello " + name);
}

สร้าง Function แบบมีการ Return ข้อมูล

การประกาศ Function ที่มีการ Return ข้อมูล ให้เราระบุ Type ของ ข้อมูลที่เราต้องการจะ Return ตามตัวอย่างดังนี้

func cal(a int, b int) int {
  return a + b
}

// เรียกใช้ Function cal()
result := cal(100, 20)

สร้าง Function แบบมีการ Return ค่าหลายค่า

ในการสร้าง Function ภาษา Go จะมีความพิเศษกว่าภาษาอื่นๆ ตรงที่สามารถสร้าง Function ที่ Return ค่าออกมาได้หลายค่า มาดูตัวอย่างกันครับ

func getProfile() (string, int)  {
  name := "thiti"
  age := 25

  return name, age
}

// เรียกใช้ Function getProfile()
name, age := getProfile()

// กรณีไม่สนใจที่จะเอาอายุไปใช้ สามารถเขียนแบบนี้ได้ครับ
name, _ := getProfile()

การใช้ Loop แบบต่างๆ

อย่างที่บอกไว้ตอนต้นว่า Go จะเน้นความกระชับของภาษา ดังนั้น Go จึงมีแค่ for loop เท่านั้นครับ แต่ถ้าอยากจะใช้ loop แบบอื่นๆ ก็สามารถทําได้เช่นกันนะครับ มาดูตัวอย่างกันครับ

For Loop

for i:= 1; i< 9; i++ {
   fmt.Println(i);
}

// ผลลัพธ์ที่ได้คือ
// 1, 2, 3, 4, 5, 6, 7, 8

Do While Loop

i := 1;

for {
    if i==2 {
       println(i);
       break;
    }
    i++;
}

// ผลลัพธ์ที่ได้คือ
// 2

While Loop

i := 1;

for i <= 5 {
    fmt.Println(i);
    i = i + 1;
}

// ผลลัพธ์ที่ได้คือ
// 1, 2, 3, 4, 5

จะเห็นว่าการ Loop ทั้งหมดจะใช้ For ทั้งหมดเลย

การใช้ if else condition

การใช้ if else ใน Go จะมีสองแบบดังนี้ครับ

if else แปบปกติ

// if else
x := 10;
if x < 10 {
   println("x มีค่าน้อยกว่า 10");
} else {
   println("x มีค่ามากว่า หรือ เท่ากับ 10");
}

// if else if
x := 10;
if x < 10 {
   println("x มีค่าน้อยกว่า 10");
} else if x == 10 {
   println("x มีค่าเท่ากับ 10");
} else {
   println("x มีค่ามากกว่า 10");
}

if else แปบมี Process ก่อน

ปกติถ้ามี Process ก่อนที่จะเข้า if else เราจะเขียนแบบนี้

a := 2;
b := 3;
k := 0;

k = a + b;

if k == 5 {
   println("k มีค่าเท่ากับ 5");
}

แต่ใน Go สามารถเขียนแบบนี้ได้ครับ

a := 2;
b := 3;
k := 0;

if k = a + b; k == 5 {
   println("k มีค่าเท่ากับ 5");
}

การใช้งาน Array

Array ใน Go จะเป็น Type ประเภทหนึ่งที่เวลาประกาศจะต้องกําหนดขนาดของ Array เสมอ ซึ่งขนาดจะเป็นค่าคงที่ ลองดูตามตัวอย่างนี้ครับ

var a [5]int; //นี้ก็หมายความว่า a เป็น type int ที่มี Block การใส่ข้อมูล 5 ช่อง

// ระบุข้อมูลให้กับ Array แต่ละช่อง ยกเว้น 2 ช่องสุดท้าย
a[0] = 1;
a[1] = 2;
a[2] = 3;

// จะได้ผลลัพธ์ตามนี้ครับ จะเห็นว่าสองช่องสุดท้ายเราไม่ได้กําหนดข้อมูล ทําให้มีค่าเป็น Default
// [1, 2, 3, 0, 0]

ถ้าจะกําหนดค่าของ Array ตั้งแต่ต้นจะทําอย่างไร สามารถกําหนดได้ตามตัวอย่างนี้ครับ

// การประกาศ Array แบบมีค่าเริ่มต้น
var name = [3]string{"aaa", "bbb", "ccc"};

// ค่าของ name จะได้ประมาณนี้ครับ
// [aaa, bbb, ccc]

การใช้งาน Slice

จะเห็นว่าเวลาเราใช้งาน Array แบบปกติ เราจะต้องกําหนดขนาดไว้ก่อนล่วงหน้า ซึ่งไม่ค่อยยืดหยุ่น Slice จึงเข้ามาแก้ปัญหานี้ โดยที่ Slice จะสามารถประกาศตัวแปรได้เหมือนกับ Array แต่ไม่ต้องกําหนดขนาดล่วงหน้า มาดูตัวอย่างกันครับ

// การประกาศตัวแปร Slice
name := []string{}; 

// การใส่ค่าใน Slice
name = append(name, "aaa");
name = append(name, "bbb");
name = append(name, "ccc");

// ค่าของ name จะได้ประมาณนี้ครับ
// [aaa, bbb, ccc]

ถ้าเราต้องการจะ get ขนาดของ Array หรือ Slice เราสามารถทําได้ดังนี้

len(ตัวแปร array)

การใช้งาน Map

Map จะเป็น Data Structure รูปแบบหนึ่งที่จะเป็บข้อมูลแบบ Key Value

การประกาศ Map สามารถทําได้ดังนี้ครับ

// ประกาศตัวแปร Map
m := make(map[string]int);

// ใส่ข้อมูลใน Map
m["aaa"] = 1;
m["bbb"] = 2;
m["ccc"] = 3;

// ข้อมูลใน m ก็จะประมาณนี้ครับ
// map[aaa:1 bbb:2 ccc:3]

จะเห็นว่าเราใช้ make ในการสร้าง ซึ่งเป็น Function พื้นฐานของ Go ผมจะยังไม่ลงรายละเอียดใบบทความนี้นะครับ

ส่วน map[string]int หมายถึง ตัวแปร Map ที่มี key เป็น string และ value เป็น int

ถ้าเราต้องการจะลบ Key Value ที่เราไม่ต้องการ เราสามารถทําได้ดังนี้

// ถ้าเรามี Map ตามนี้
// m := map[aaa:1 bbb:2 ccc:3]

// เราต้องการลบ key value ของ bbb ออก เราจะใช้คำสั่ง
delete(m, "bbb"); // delete(ตัวแปร map, key ที่ต้องการลบ)

เท่านี้เราก็สามารถลบ key value ของ bbb ออกได้แล้วครับ

ก็ประมาณนี้ครับสําหรับบทความนี้ ซึ่งเป็นเนื้อหาเกี่ยวกับ Syntax ของภาษา Go เพื่อทุกท่านจะสามารถนําไปต่อยอดได้ครับ

ขอให้สนุกกับการเขียน Code นะครับ

สําหรับ EP. ต่อไปจะเป็นเรื่อง Go EP.5 Go Routine เข้าไปอ่านต่อได้เลยครับ

thiti.dev © 2021 Thiti Yamsung