Basic Syntax
Golang
ไฟล์ Go ประกอบด้วยส่วนต่างๆ ต่อไปนี้:
ประกาศแพคเกจ
แพคเกจนำเข้า
ฟังก์ชั่น
คำสั่งและการแสดงออก
เช่น
package main
import ("fmt")
func main() {
fmt.Println("Hello GDSC!")
}
Package
Package คือที่เก็บฟังก์ชันและหนึ่งแพ็คเกจสามารถมีไฟล์จำนวนมากที่คุณสามารถตั้งชื่อได้อย่างอิสระ
Import
Import คือนำเข้า Package จากข้างนอกเข้ามาใช้ใน file go ที่เราเขียนอยู่
Example:
import "fmt" --------------------------------> fmt is the name of a package
import "os" ---------------------------------> os is the name of a package
import "github.com/gopherguides/greet" ------> the underlined part is the path of the package
Import เรียกใช้ได้ 2 แบบ คือ Direct Import กับ Grouped Import
Example:
Direct import:
Single:
import "fmt"
Multiple one-by-one:
import "fmt"
import "math"
Grouped import:
import(
"fmt"
"math"
)
Variables
Go เป็นภาษาที่พิมพ์แบบคงที่ หมายความว่าคุณต้องประกาศประเภทตัวแปรเมื่อคุณประกาศตัวแปร และไม่สามารถเปลี่ยนแปลงได้ จุดนี้ทำให้ Golang ทำงานได้รวดเร็ว เนื่องจาก compiler ไม่จำเป็นต้องระบุประเภทตัวแปรในขณะ runtime
package main
import "fmt"
const globalConstant = 2.72
const ExportedGlobalConstant = 3.14
func main() {
var first string
first = "This is first string"
var second = "This is second string"
third := "This is third string"
fmt.Println(first, second, third)
}
มีสามวิธีในการประกาศตัวแปร จากตัวอย่างข้างต้น แบบแรกคือการประกาศโดยระบุประเภทให้กับตัวแปรด้วยตนเอง ส่วนแบบที่สองและสามคือการประกาศแบบไม่ระบุประเภทด้วยตนเอง แต่ใช้คำสั่งหลังเครื่องหมายเท่ากับกำหนดประเภทแทน สำหรับตัวที่สาม จะต้องมีเครื่องหมาย (:) เพื่อประกาศตัวแปร หากไม่มีเครื่องหมายทวิภาค คอมไพลเลอร์จะส่งข้อผิดพลาดหากคุณยังไม่เคยประกาศตัวแปรมาก่อน
Variables type
package main
import "fmt"
func main() {
a := 1 // var a int
b := 3.14 // var b float
c := "hi" // var c string
d := true // var d bool
fmt.Println(a, b, c, d)
e := []int{1, 2, 3} // slice
e = append(e, 4)
fmt.Println(e, len(e), e[0], e[1:3], e[1:], e[:2])
f := make(map[string]int) // map
f["one"] = 1
f["two"] = 2
fmt.Println(f, len(f), f["one"], f["three"])
}
Like other languages, Go has int, float, string, and boolean as primitive types.
Struct
ตัวแปรประเภทต่อไปคือ "struct" อนุญาตให้โปรแกรมเมอร์กำหนดประเภทข้อมูลใหม่ที่มีประเภทข้อมูลอื่น (เรียกว่าฟิลด์) ในตัวมันเอง แต่ละฟิลด์สามารถส่งออกได้โดยใช้กฎเดียวกันกับตัวแปรส่วนกลางซึ่งใช้อักษรตัวแรกของฟิลด์เป็นตัวพิมพ์ใหญ่ หมายความว่าจากฟิลด์ชื่อรหัสและอายุสามารถเข้าถึงได้โดยแพ็คเกจอื่น ๆ ในขณะที่ isAdmin ไม่สามารถเข้าถึงได้ ฟิลด์สามารถกำหนด "แท็ก" (`json:"name"`) เป็นข้อมูลเมตาสำหรับไลบรารีบางไลบรารี เช่น JSON libraries (https://golang.org/pkg/encoding/json/) ที่ใช้ "แท็ก" เพื่อแมป Go ฟิลด์โครงสร้างและฟิลด์ JSON
package main
import "fmt"
type Person struct{
Name string `json:"name"`
Age int `json:"age"`
isAdmin bool
}
func main() {
p := Person{
Name: "Mike",
Age: 16,
isAdmin: false,
}
fmt.Println(p, p.Name, p.Age, p.isAdmin)
}
Type Conversion
package main
import (
"fmt"
"strconv"
"reflect"
)
func main() {
a := 3.14
b := int(a)
fmt.Println(b, reflect.TypeOf(b))
c := "12.34"
d, _ := strconv.ParseFloat(c, 64)
fmt.Println(d, reflect.TypeOf(d))
e := false
f := fmt.Sprint(e)
fmt.Println(f, reflect.TypeOf(f))
}
Control Flow Statements
Conditions
package main
import "fmt"
func main() {
// if, else
a := 5
if a > 3 {
a = a - 3
} else if a == 3 {
a = 0
} else {
a = a + 3
}
fmt.Println(a)
// switch, case
b := "NO"
switch b {
case "YES":
b = "Y"
case "NO":
b = "N"
default:
b = "X"
}
fmt.Println(b)
}
Loop
package main
import "fmt"
func main() {
// for
c := 3
for i := 0; i < c; i++ {
fmt.Print(i, " ")
}
fmt.Println()
// replace while with for
for c > 0 {
fmt.Print(c, " ")
c--
}
fmt.Println()
// for with range
d := []int{0, 1, 1, 2, 3, 5, 8}
for _, i := range d {
fmt.Print(i, " ")
}
fmt.Println()
}
Defer
คำสั่ง "defer" เป็นคำสั่งพิเศษใน Go คุณสามารถเรียกใช้ฟังก์ชันใด ๆ หลังจากคำสั่งเลื่อน ฟังก์ชั่นจะถูกเก็บไว้ในสแต็กและจะถูกเรียกใช้หลังจากที่ฟังก์ชันผู้เรียกกลับมา ดังที่คุณเห็นในตัวอย่าง มีการกลับลำดับของการเรียกใช้ฟังก์ชัน
package main
import "fmt"
func main() {
f()
}
func f() (int, error) {
defer fmt.Println("DEFER 1")
defer fmt.Println("DEFER 2")
defer fmt.Println("DEFER 3")
fmt.Println("BODY")
return fmt.Println("RETURN")
}
Functions
Function components
Go function has 4 parts.
- Name: ชื่อควรจะเป็น แบบ camelCase / CamelCase.
- Arguments: ฟังก์ชันสามารถรับargumentsเป็นศูนย์หรือมากกว่าได้ สำหรับargumentsที่อยู่ติดกันตั้งแต่ 2 รายการขึ้นไปที่มีประเภทเดียวกัน คุณสามารถกำหนดประเภทที่ด้านหลังของargumentsสุดท้ายได้ (เช่น "String" ในตัวอย่าง)
- Return Types: ฟังก์ชันสามารถคืนค่าเป็นศูนย์หรือมากกว่าได้ หากส่งคืนค่ามากกว่าหนึ่งค่า คุณต้องใส่วงเล็บปิด
- Body: It is a logic of a function.
Name Return Values
เราสามารถเซ็ต ชื่อตัวแปรที่เราจะ return ค่าออกไปได้ โดยที่ไม่ต้องใส่ตัวแปรนั้นไว้ line เดียวกับ return
Example:
package main
import "fmt"
func main() {
fmt.Println(threeTimes("Thank You GDSC"))
}
func threeTimes(msg string) (tMsg string) {
tMsg = msg + ", " + msg + ", " + msg
return
}
Exported / Unexported Functions
package main
import "fmt"
func main() {
s := Sum(10)
f := factorial(10)
fmt.Println(s, f)
}
func Sum(n int) int { // exported function
sum := 0
for i := 1; i <= n; i++ {
sum += i
}
return sum
}
func factorial(n int) int { // unexported function
fac := 1
for i := 1; i <= n; i++ {
fac *= 1
}
return fac
}
Anonymous Functions
package main
import "fmt"
func main() {
a := 1
b := 1
c := func(x int) int {
b *= 2
return x * 2
}(a)
fmt.Println(a, b, c)
}
func mainAnother() {
myFunc := func(x int) int {
return x * x
}
fmt.Println(myFunc(2), myFunc(3))
}
Blank Identifiers
package main
import "fmt"
func main() {
x, _ := evenOnly(10)
fmt.Println(x)
}
func evenOnly(n int) (int, error) {
if n%2 == 0 {
return n / 2, nil
}
return 0, fmt.Errorf("not even")
}