การสร้างโปรเจคที่ GOPATH


ในบทความที่ผ่านมา Workshop พื้นฐานภาษา Go จะเป็นการสร้างโปรเจคภาษา Go ในโฟลเดอร์อืนๆที่ไม่ใช่ โฟลเดอร์ GOPATH ซึ่งในการเขียนโปรแกรมที่มีขนาดที่ใหญ่ขึ้น ที่มีความจำเป็นในการเรียกใช้งานฟังก์ชัน จาก ไฟล์อื่นๆ ที่ไม่อยู่ในไฟล์ main.go ซึงจะทำให้เกิดปัญหาในการเรียกใช้งาน รวมทั้งปัญหาในการใช้งานด้านอื่นๆ ฉะนั้น ในการสร้างโปรเจคที่ถูกต้องควรอยู่ที่ โฟลเดอร์ GOPATH


การตรวจสอบว่าโฟลเดอร์ที่เป็น GOPATH ทำได้ดังนี้


ที่ช่องค้นหาพิมพ์คำว่า “env” แล้ว เลือก Edit the system environment variables


คลิกที่ Environment Variables…

หาคำว่า GOPATH ในคอมเครื่องนี้อยู่ C:\Users\ชื่อผู้ใช้\go

โดยสามารถเปลี่ยน GOPATH ไปยังโฟลเดอร์ที่ต้องการด้วยการคลิกที่ Edit…


Workshop 2 New Deck (สร้างรายชื่อไพ่)


สร้างโปรเจคใหม่ โดยไปที่ File -> Open Folder…


ไปที่ GOPATH ในตัวอย่างนี้อยู่ที่ C:\Users\ชื่อผู้ใช้\go -> Select Folder


สร้างโฟลเดอร์ใหม่ชื่อ src สำหรับเก็บโปรเจคภาษา Go ของเรา


สร้างโฟลเดอร์โปรเจคชื่อ cards อยู่ภายในโฟลเดอร์ src


สร้างไฟล์ deck.go โดยคลิกไปที่ไอคอน New File ตั้งชื่อเป็น deck.go

เขียนโค้ดดังนี้

package main

import "fmt"

type deck []string

func newDeck() deck {
	cards := deck{}

	cardSuits := []string{"Spades" , "Diamonds", "Hearts", "Clubs"}
	cardValues := []string{"Ace" , "Tow", "Three", "Four"}

	for _, suit := range cardSuits {
		for _, value := range cardValues {
			cards = append(cards, value+" of "+suit)
		}
	}

	return cards

}

func (d deck) print() {
	for i, card := range d {
		fmt.Println(i, card)
	} 
}



สร้างไฟล์ main.go โค้ดสำหรับจัดการ deck เขียนโค้ดดังนี้


package main

func main() {
	cards := newDeck()

	cards.print()
}

ไปที่ Terminal -> New Terminal


เข้าไปในโฟลเดอร์ src ด้วยคำสั่ง cd src


เข้าไปในโฟลเดอร์ cards ด้วยคำสั่ง cd cards


Run ไฟล์ซอร์สโค้ด ทั้ง 2 ไฟล์ ด้วยคำสั่ง go run main.go deck.go


ผลลัพธ์การทำงาน



อธิบายโค้ด deck.go


package main // ประกาศชื่อแพคเกจไว้ด้านบนเสมอ

import "fmt"  // นำเข้า package fmt มาใช้งาน สำหรับ พิมพ์ข้อความออกจอ

type deck []string // สร้างชนิดข้อมูลอาร์เรย์ของสตริง ที่สร้างขึ้นมาเพื่อใช้งานโดยเฉพาะ

/*
การ Return Value ออกจาก ฟังก์ชันนั้น เราจะประกาศ Type ของ สิ่งที่จะ Return 
ต่อจาก วงเล็บของฟังก์ชัน เช่น deck เวลาเราจะใช้งานต้องหาตัวแปร เช่น cards มารับค่าจาก ฟังก์ชัน
*/

func newDeck() deck { // ฟังก์ชัน newDeck มี Return type ชนิดข้อมูลเป็น deck ที่สร้างขึ้นมาเพื่อใช้งานโดยเฉพาะ
 
	cards := deck{} // ประกาศตัวแปร cards แบบ slice พร้อมทั้งกำหนดค่า เป็นค่าของ deck

// ประกาศตัวแปร cardSuits แบบ slice มีค่า เป็น โพธ์ดำ, ข้าวหลามตัด, โพธ์แดง, ดอกจิก
    cardSuits := []string{"Spades" , "Diamonds", "Hearts", "Clubs"}


// ประกาศตัวแปร cardValues แบบ slice มีค่า เป็น A, 2, 3, 4
	cardValues := []string{"Ace" , "Tow", "Three", "Four"}


// ใช้ For Loop เชื่อมต่อข้อความ cardValues เข้ากับ cardSuits

	for _, suit := range cardSuits {
		for _, value := range cardValues {
			cards = append(cards, value+" of "+suit)
		}
	}

	return cards // ส่งค่าคืนไปที่ฟังก์ชัน newDeck() deck

}


ข้อดีภาษา Go : สามารถสร้างชนิดข้อมูลขึ้นมาใหม่ตามความต้องการของผู้เขียนได้


อธิบายโค้ด ฟังก์ชัน print


เมธอด รีซีพเวอร์ (Method receiver) เมธอดประเภทนี้จะใช้วิธีการ copy value และ สร้างตัวแปรใหม่เพื่อเก็บค่า เช่นสร้างสำเนาจาก ‘deck’ ตั้งชื่อว่า ‘d’ และ ทุกชนิดตัวแปร สามารถเรียกใช้ฟังก์ชัน ‘deck’ นี้ได้ด้วยตัวเอง

Method receiver นั้นจะเหมือนกับ argument ของ function นั่นคือ ถ้าทำการประกาศแบบปกติ จะเป็นการ pass by value (เป็นค่าของข้อมูล ไม่ใช่ตำแหน่ง) ทำให้เมื่อทำการแก้ไขข้อมูลแล้ว จะไม่กระทบกับข้อมูลต้นทางหรือ original

func (d deck) print() {  // ชนิดข้อมูล "deck" ตอนนี้เข้าถึงวิธีการ "พิมพ์" ได้แล้ว
	for i, card := range d { // วนรอบตามจำนวนของ d
		fmt.Println(i, card) // พิมพ์ข้อความตัวเลข i และข้อมูลของ card ออกจอ
	} 
}


อธิบายโค้ด ฟังก์ชัน main


package main // ประกาศชื่อแพคเกจไว้ด้านบนเสมอ

func main() { // ฟังก์ชัน main เป็นจุดเริ่มต้นการทำงาน
	cards := newDeck() // ประกาศตัวแปร cards แบบ slice มีค่าเท่ากับ ฟังก์ชัน newDeck

	cards.print() // เรียกใช้ฟังก์ชัน print จากไฟล์ deck.go
}


>> Workshop-3 Deal & SaveToFile

credit : https://www.udemy.com/course/go-the-complete-developers-guide/

Leave a Reply

Your email address will not be published. Required fields are marked *