Skip to content

คู่มือเริ่มต้นใช้งาน Go

บทความนี้จะแนะนำวิธีเริ่มต้นเรียนรู้ภาษา Go ในแง่ของไวยากรณ์แล้วมันไม่ยากที่จะเรียนรู้ คุณน่าจะสามารถใช้งานได้ในเวลาไม่กี่วัน อย่างไรก็ตาม ตามธรรมเนียมแล้ว ก่อนเริ่มต้นอย่างเป็นทางการ เราจำเป็นต้องเข้าใจพื้นหลังและที่มาของภาษาก่อน

พื้นหลัง

ภาษา Go ถูกสร้างขึ้นโดยผู้เชี่ยวชาญสามท่าน ได้แก่

  • Ken Thompson ผู้ได้รับรางวัลทัวริง ผู้ก่อตั้งระบบ Unix ผู้ก่อตั้งภาษา B ผู้ก่อตั้งภาษา C
  • Rob Pike หนึ่งในผู้เขียนระบบปฏิบัติการ Plan9 หนึ่งในผู้ประดิษฐ์ UTF-8 ผู้นำการออกแบบภาษา Go
  • Robert Griesemer ผู้พัฒนาเอนจิน JS V8 อายุน้อยที่สุดในสามคน

ยังมีอีกหนึ่งท่านคือ Renee French ภรรยาของ Rob Pike เธอออกแบบ Logo ของภาษา Go ซึ่งเป็นตัวตัวตุ่นสีน้ำเงิน

ในวันหนึ่ง วิศวกรสามคนรู้สึกเบื่อหน่ายอย่างยิ่งในระหว่างการรอการคอมไพล์โปรเจกต์ C++ ที่ยาวนาน ในขณะนั้น Rob Pike ได้เกิดความคิดใหม่ขึ้นมาในหัวอย่างฉับพลัน เขาต้องการออกแบบภาษาการเขียนโปรแกรมที่เรียบง่าย ขนาดเล็ก คอมไพล์เร็ว และมีประสิทธิภาพที่ดี เพื่อที่พวกเขาจะได้ไม่ต้องเผชิญกับการรอคอยที่ยาวนานทุกครั้งที่ต้องคอมไพล์ หลังจากการระดมสมองสั้น ๆ ทั้งสามได้จัดการประชุมสั้น ๆ เมื่อวันที่ 20 กันยายน 2007 เพื่อเริ่มอภิปรายและออกแบบต้นแบบเบื้องต้นของภาษานี้ และตั้งแต่ช่วงเวลานั้น ภาษา Go ก็ได้ถือกำเนิดขึ้น ต่อมา ทีมเล็กนี้ได้ดึงดูดนักพัฒนาที่志同道合มากขึ้นเรื่อย ๆ และในที่สุดเมื่อวันที่ 10 พฤศจิกายน 2009 บริษัท Google ก็ได้เปิดแหล่งที่มาภาษา Go ด้วยโปรโตคอล BSD-3-Clause อย่างเป็นทางการ และเปิดตัวเวอร์ชันนำร่องแรก และจัดตั้งทีมพัฒนาอย่างเป็นทางการ

คำแนะนำ

ควรค่าแก่การกล่าวถึง คุณอาจเห็นบางคนเรียกมันว่า Golang ในที่อื่น รวมถึงชื่อรีพอสิทอรี Github ของเว็บไซต์นี้ก็เรียกว่า Golang-Doc แต่ชื่อทางการของมันจริง ๆ แล้วคือ Go มาตลอด ในยุคแรก ๆ เนื่องจากโดเมน go ถูกจดทะเบียนไปแล้ว ดังนั้นโดเมนของเว็บไซต์ทางการจึงใช้ golang.org ทำให้คนที่มาใหม่เข้าใจผิดว่ามันชื่อ Golang

นี่คือหน้าตาเดิมของเว็บไซต์ทางการ

หลังจากนั้น ทีม Go ผ่านการออกแบบและการวิจัยและพัฒนาเป็นเวลาสามปี และเผยแพร่เวอร์ชันทางการแรก Go1.0 ในเดือนมีนาคม 2012 (ในเวลานั้น toolchain และ runtime ของ Go ยังคงเขียนด้วยภาษา C จนกระทั่ง Go1.5 จึงเสร็จสิ้นการ bootstrap) หลังจากนั้นทุกปีจะเผยแพร่การอัปเดตเวอร์ชันย่อยสองครั้ง และดำเนินการบำรุงรักษาจนถึงปัจจุบัน

ผู้ก่อตั้งทั้งสามจริง ๆ แล้วได้ถอยออกมาตั้งแต่เนิ่น ๆ ในเวลาส่วนใหญ่ ผู้นำทีมคือ Russ Cox เขาได้เข้าร่วมในงานพัฒนาตั้งแต่ก่อนที่ภาษา Go จะเผยแพร่สู่ภายนอก และหลังจากนั้นก็ได้จัดการทีม Go มาเป็นเวลา 12 ปี จนกระทั่งลาออกในเดือนสิงหาคม 2024 และ Austin Clements ได้เข้ารับตำแหน่งและนำงานพัฒนาต่อไป

หากคุณต้องการเข้าใจประวัติศาสตร์ของภาษา Go อย่างลึกซึ้ง ไปที่ Go History เพื่อเรียนรู้เพิ่มเติม

คุณสมบัติ

  • ไวยากรณ์เรียบง่าย ภาษา Go ได้ทำการแลกเปลี่ยนระหว่างอิสระและความยืดหยุ่น เพื่อ换来การบำรุงรักษาที่ดีขึ้นและเส้นโค้งการเรียนรู้ที่ราบรื่น
  • เป็นมิตรต่อการปรับใช้ ไฟล์ไบนารีที่คอมไพล์แบบสถิตของ Go ไม่ขึ้นอยู่กับสภาพแวดล้อมรันไทม์เพิ่มเติม และความเร็วในการคอมไพล์ก็รวดเร็วมาก
  • การคอมไพล์ข้าม Go เพียงต้องการตั้งค่าพารามิเตอร์สองตัวง่าย ๆ ในระหว่างการคอมไพล์ ก็สามารถคอมไพล์เป็นโปรแกรมที่สามารถรันบนแพลตฟอร์มอื่นได้
  • คอนเคอเรนซ์โดยธรรมชาติ การสนับสนุนคอนเคอเรนซ์ของภาษา Go เป็นไปโดยธรรมชาติ เพียงใช้คำหลักเดียว ก็สามารถเริ่มโค 루ทีนแบบอะซิงโครนัสได้
  • การเก็บขยะ Go มีประสิทธิภาพ GC ที่ยอดเยี่ยม ในกรณีส่วนใหญ่ความล่าช้าของ GC จะไม่เกิน 1 มิลลิวินาที
  • ไลบรารีมาตรฐานที่อุดมสมบูรณ์ ตั้งแต่การประมวลผลสตริงไปจนถึงการแยกวิเคราะห์ AST ของซอร์สโค้ด ไลบรารีมาตรฐานที่มีประสิทธิภาพและอุดมสมบูรณ์เป็นรากฐานที่มั่นคงของภาษา Go
  • toolchain ที่สมบูรณ์ Go มี toolchain การพัฒนาที่สมบูรณ์ ครอบคลุมการคอมไพล์ การทดสอบ การจัดการ dependencies การวิเคราะห์ประสิทธิภาพ และอื่น ๆ

ภาษา Go ได้ละทิ้งการสืบทอด อ่อน化了 OOP คลาส เมตาโปรแกรมมิ่ง generics นิพจน์ Lamda และคุณสมบัติอื่น ๆ มีประสิทธิภาพที่ดีและความยากในการเริ่มต้นที่ต่ำ เหมาะสำหรับใช้ในการพัฒนาบริการคลาวด์ การพัฒนาเซิร์ฟเวอร์แอปพลิเคชัน และการเขียนโปรแกรมเครือข่าย มันมี GC ในตัว ไม่ต้องให้นักพัฒนาจัดการหน่วยความจำด้วยตนเอง การคอมไพล์แบบสถิตและการคอมไพล์ข้ามสองจุดนี้เป็นมิตรต่อการดำเนินงานอย่างมาก

ข้อเสียของภาษา Go ก็มีมากมายเช่นกัน เช่น การจัดการข้อผิดพลาดที่ถูกวิจารณ์ generics ที่ไม่สมบูรณ์ ไลบรารีมาตรฐานแม้อุดมสมบูรณ์แต่โครงสร้างข้อมูลในตัวมีไม่กี่อย่าง ประเภท interface{} เต็มไปหมด ไม่มีประเภท enum นอกจากนั้น ทีมพัฒนา Go ดื้อรั้นมาก ไม่ค่อยฟังความคิดเห็นจากชุมชน เป็นต้น (เมื่อเทียบกับ Rust แล้วทำได้ดีกว่ามากในด้านการจัดการข้อผิดพลาด generics การจัดการ dependencies enum อินเทอร์เฟซ และอื่น ๆ)

โดยสรุปแล้ว เราจำเป็นต้องมองภาษาหนึ่งอย่างมีวิจารณญาณ ในฐานะภาษาวิศวกรรม Go สามารถปรับปรุงขีดจำกัดล่างของทีมได้เป็นอย่างมาก แม้แต่นักพัฒนาที่มีระดับต่ำที่สุดก็สามารถรองรับได้ นาน ๆ ครั้งจะเกิดสถานการณ์ที่คนคนเดียวทำลายทุกอย่าง และเนื่องจากไวยากรณ์ที่เรียบง่ายและความยากในการเรียนรู้ที่ต่ำ ทำให้คนสามารถเริ่มต้นโปรเจกต์ได้เร็ว แม้ Go จะเผยแพร่ออกมาไม่ถึงสิบปี แต่ก็มีบริษัทจำนวนมากที่เลือก Go เป็นภาษาแรก ซึ่งก็สามารถบ่งบอกว่า Go กำลังได้รับความนิยมเพิ่มขึ้น

พูดเพิ่มเติม Go ยังเป็นภาษาที่เปิดแหล่งที่มาอย่างสมบูรณ์ โดยชุมชนและ Google ร่วมกันบำรุงรักษาการพัฒนาของภาษา Go ที่อยู่ทางการอยู่ในรีพอสิทอรีของ Google บน Github มีรีพอสิทอรีมิเรอร์ที่เหมือนกัน หากคุณสนใจคุณสามารถมีส่วนร่วมในการออกแบบภาษาได้

เว็บไซต์ทางการ The Go Programming Language

รีพอสิทอรีเปิดแหล่งที่มาของ Google google/go: Google Open Source

รีพอสิทอรี Github golang/go: The Go programming language

TIP

ผู้เขียนเคยส่ง PR ให้ Go หากคุณต้องการเข้าใจวิธีมีส่วนร่วมโค้ดให้ Go สามารถดูบทความนี้ที่ฉันเขียน 如何向 Go 贡献代码

เชื่อว่าหลายคนน่าจะเคยได้ยินเกี่ยวกับ Rust ไม่มากก็น้อย มันเป็นภาษาการเขียนโปรแกรมอเนกประสงค์ที่มีประสิทธิภาพสูง เวลาเกิดของมันเร็วกว่า Go หนึ่งปี เวลาที่ Go1 เผยแพร่อย่างเป็นทางการคือปี 2012 เวลาที่เวอร์ชันทางการของ Rust เผยแพร่คือปี 2015 ทั้งสองเป็นภาษาที่ทันสมัยค่อนข้างมาก ผู้เขียนชอบทั้งสองภาษานี้มาก ขอบเขตการพัฒนาของทั้งสองภาษานี้แตกต่างกัน หากคุณไม่พอใจกับประสิทธิภาพการรันและความสามารถในการแสดงออกของ Go ลองใช้ Rust ดู อย่างไรก็ตาม ความยากในการเรียนรู้ของมันไม่เรียบง่ายเหมือน Go เลย

การติดตั้ง

ดาวน์โหลดภาษา Go Downloads - The Go Programming Language

Stable Version หมายถึงสองเวอร์ชันที่เสถียรซึ่งอยู่ในระหว่างการบำรุงรักษาในปัจจุบัน Archived Version หมายถึงเวอร์ชันประวัติศาสตร์ที่ไม่ได้บำรุงรักษาแล้ว ไปที่ บันทึกการอัปเดต เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับกฎการบำรุงรักษาและข้อมูลเวอร์ชันประวัติศาสตร์

windows

สำหรับแพลตฟอร์ม windows มีสองประเภทให้เลือกคือ installer และ archive ประเภทแรกคือแพ็กเกจติดตั้ง เพียงแค่คลิก ๆ แนะนำให้ใช้ประเภทหลัง จะทำให้คุณคุ้นเคยกับโครงสร้างไดเรกทอรีของภาษา Go มากขึ้น ในอนาคตหากมีปัญหาจะไม่ลุกลน เลือกดาวน์โหลดไฟล์ zip ในไฟล์บีบอัดมีซอร์สโค้ดของภาษา Go รวมถึง toolchain และเอกสารบางฉบับ แตกไฟล์ไปยังพาธที่ระบุ จากนั้นต้องกำหนดค่าตัวแปรสภาพแวดล้อมของระบบสองตัว

  • GOROOT - พาธการติดตั้งของภาษา Go
  • GOPATH - พาธเก็บ dependencies ของภาษา Go

หลังจากตั้งค่าแล้ว เพิ่มสองรายการใหม่ให้กับตัวแปรสภาพแวดล้อมของระบบ PATH

  • %GOROOT%\bin นี่คือที่อยู่โปรแกรมไบนารีของ go
  • %GOPATH%\bin นี่คือที่อยู่เก็บไฟล์ไบนารีของ dependencies บุคคลที่สามที่จะดาวน์โหลดในอนาคต

ดำเนินการคำสั่ง go version ใน powershell สุดท้าย若能แสดงเวอร์ชันได้อย่างปกติแสดงว่าการติดตั้งถูกต้อง

powershell
PS C:\user\username> go version
go version go1.21.3 windows/amd64

การอัปเดตเพียงดาวน์โหลด zip ใหม่ทับไดเรกทอรีติดตั้งเดิม即可

linux

ยกตัวอย่าง ubuntu คัดลอกลิงก์ของเวอร์ชันที่ต้องการ ดาวน์โหลดไปยังท้องถิ่น

sh
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz

แตกไฟล์ไปยังไดเรกทอรีที่ระบุ

sh
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gz

ตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์ $HOME/.bashrc

sh
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

หลังจากเสร็จสิ้นแล้วดูเวอร์ชันการติดตั้ง ยืนยันการติดตั้งอย่างถูกต้อง

sh
$ go version
go version go1.21.1 linux/amd64

การอัปเดตเพียงดาวน์โหลด tar.gz ใหม่ทับไดเรกทอรีติดตั้งเดิม即可

การจัดการการติดตั้ง

วิธีการติดตั้งข้างต้นเพียงพอสำหรับการใช้งานพื้นฐาน ผู้เขียนแนะนำให้ใช้โครงสร้างไดเรกทอรีต่อไปนี้เพื่อเก็บภาษา Go และไฟล์ที่เกี่ยวข้อง

go/
|
|--root/
|  |
|  |--go1.21.3/
|  |
|  |--go1.20.10/
|
|--mod/
|  |
|  |--bin/
|  |
|  |--libs/
|
|--cache/
|
|--temp/
|
|--env

คำอธิบายมีดังนี้

  • ไดเรกทอรี go/root ใช้สำหรับเก็บไฟล์ซอร์สของภาษา Go แต่ละเวอร์ชัน
  • go/mod ตรงกับ GOAPTH
  • go/mod/libs ตรงกับ GOMODCACHE ซึ่งคือที่อยู่เก็บ dependencies บุคคลที่สามที่ดาวน์โหลด
  • go/mod/bin ตรงกับ GOBIN ที่อยู่เก็บไฟล์ไบนารีของ dependencies บุคคลที่สาม
  • go/cache ตรงกับ GOCACHE เก็บไฟล์แคช
  • go/temp ตรงกับ GOTMPDIR เก็บไฟล์ชั่วคราว
  • go/env ตรงกับ GOENV ไฟล์กำหนดค่าตัวแปรสภาพแวดล้อมทั่วโลก

วิธีนี้ไม่ต้องทับไดเรกทอรีติดตั้งเดิมเมื่ออัปเดต เพียงเก็บไว้ในไดเรกทอรี go/root จากนั้นแก้ไขตัวแปรสภาพแวดล้อมของระบบ GOROOT เป็นโฟลเดอร์ของเวอร์ชันที่ระบุภายใต้ไดเรกทอรีนั้น โดยค่าเริ่มต้นไฟล์ env อ่านจากพาธ GOROOT/env ผ่านการตั้งค่าตัวแปรระบบ GOENV แยกออกจาก GOROOT หลีกเลี่ยงการเปลี่ยนแปลงการกำหนดค่าตัวแปรสภาพแวดล้อมของ go เนื่องจากการเปลี่ยนแปลงเวอร์ชัน ด้านล่างคือการตั้งค่าเริ่มต้นของไฟล์ env

ini
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/temp

นี่เป็นเพียงสไตล์ไดเรกทอรีที่ผู้เขียนชอบ ไปที่ คำสั่ง-ตัวแปรสภาพแวดล้อม เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับข้อมูลตัวแปรสภาพแวดล้อม คุณสามารถกำหนดค่าเองได้ตามความชอบส่วนตัวอย่างสมบูรณ์

การจัดการหลายเวอร์ชัน

ฉันได้เขียนเครื่องมือจัดการหลายเวอร์ชัน govm ใช้ร่วมกับโครงสร้างไดเรกทอรีข้างต้นจะได้ผลดีที่สุด มันสามารถจัดการเวอร์ชัน Go หลายเวอร์ชันในท้องถิ่น สามารถสลับเวอร์ชันได้ตลอดเวลา สามารถค้นหาและดาวน์โหลดเวอร์ชัน Go อื่น ๆ และติดตั้งไว้ในท้องถิ่น

bash
$ govm search 1.22 -n 10
go1.22.6           76 MB
go1.22.5           76 MB
go1.22.4           76 MB
go1.22.3           76 MB
go1.22.2           76 MB
go1.22.1           76 MB
go1.22.0           76 MB

$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed

$ govm use 1.22.4
Use go1.22.4 now

# เข้าสู่ระบบ shell ใหม่
$ go version
go version go1.22.4 windows/amd64

หากคุณต้องการเข้าใจวิธีเขียนเครื่องมือบรรทัดคำสั่งด้วย Go ไม่รังเกียจสามารถใช้ govm เป็นข้อมูลอ้างอิงโปรเจกต์ มันก็เขียนด้วย Go เช่นกัน

เอดิเตอร์

IDE ภาษา Go ที่เป็นกระแสหลักในปัจจุบันผู้เขียนแนะนำเพียงสองตัวต่อไปนี้

  1. goland ผลิตโดย jetbrain มีฟังก์ชันที่ทรงพลัง การสนับสนุนแบบรอบด้าน แต่ต้องชำระเงิน สามารถพิจารณา IDEA รุ่นชุมชนร่วมกับปลั๊กอิน
  2. vscode ไม่ต้องชำระเงิน เอดิเตอร์อเนกประสงค์ มีปลั๊กอินสนับสนุนสามารถเขียนภาษาใดก็ได้

หากมีเอดิเตอร์อื่นที่ตรงกับนิสัยการใช้งานของตัวเองมากขึ้นก็สามารถใช้ได้ ใช้เอดิเตอร์อะไรก็ไม่สำคัญ หากเพียงเขียนโค้ดแบบฝึกหัดสั้น ๆ สามารถลอง goplay ที่ทางการให้มา สามารถรันโค้ด go แบบออนไลน์ได้

TIP

หากคุณกำลังใช้ JetBrains Toolbox สามารถลองเครื่องมือบรรทัดคำสั่งที่ฉันเขียน AutoToolBox สามารถสร้างเมนูคลิกขวา windows ให้ Toolbox ภาพตัวอย่างมีดังนี้

ข้อคิด

ความยากโดยรวมของภาษา Go ไม่สูง หากคุณมีพื้นฐานภาษาอื่นการเรียนรู้จะง่ายมาก ในระหว่างการเรียนรู้หากพบจุดยากที่เข้าใจไม่透彻สามารถข้ามไปก่อน การเรียนรู้ภาษาใดภาษาหนึ่งล้วนต้องเข้าใจไวยากรณ์และโครงสร้างโดยคร่าวของภาษานั้นก่อน แล้วจึงลงลึกในคุณสมบัติและรายละเอียดบางประการ แนวคิดในเอกสารก็เช่นกัน เหมาะสำหรับการเรียนรู้เบื้องต้น ผู้เขียนเองก็เป็นเพียงนักเรียนธรรมดาคนหนึ่ง ย่อมมีข้อผิดพลาดและข้อผิดพลาดที่ตรวจไม่พบ หากพบข้อผิดพลาดใด ๆ สามารถส่ง PR ที่ Github ได้ หากรู้สึกว่าเอกสาร还不错สามารถกด Star ที่ Github ได้

หากคุณเป็นนักพัฒนาภาษา OOP ที่แข็งแกร่ง เช่น Java, C# เป็นต้น โปรดอย่าคิดล่วงหน้าด้วยความคิด OOP มิฉะนั้นจะรู้สึกแปลกใจต่อการออกแบบมากมายของ go และจะรู้สึกอึดอัดมากเมื่อเขียนโค้ด ผู้เขียน最开始ก็เป็นเช่นนั้น

ภาพรวม

ต่อไปนี้จะแนะนำเนื้อหาของเว็บไซต์นี้อย่างง่าย ๆ เพื่อให้ทุกท่านสามารถอ่านตามความต้องการ บางหน้าว่างเปล่าแสดงว่ายังไม่ได้อัปเดต

  • ภาษาเบื้องต้น อธิบายเนื้อหาเกี่ยวกับภาษา Go เอง เน้นทฤษฎี
    • พื้นฐานไวยากรณ์ อธิบายไวยากรณ์พื้นฐานมาก ๆ เช่น กฎไวยากรณ์ if, for และอื่น ๆ
    • ไวยากรณ์ขั้นสูง อธิบายสิ่งที่เป็นเอกลักษณ์ของ Go เกี่ยวกับโมดูล การทดสอบ โค 루ทีน และเนื้อหาที่เกี่ยวข้อง
    • ไลบรารีมาตรฐาน แนะนำไลบรารีมาตรฐานที่มาพร้อมกับ Go อย่างง่าย ๆ เนื่องจากเนื้อหาของไลบรารีมาตรฐานใหญ่มากจึงอัปเดตตามโอกาส
    • หลักการดำเนินการ อธิบายหลักการออกแบบภายในบางประการของภาษา Go เช่น การจัดตารางโค 루ทีน การจัดการหน่วยความจำ การเก็บขยะ และอื่น ๆ
  • ระบบนิเวศชุมชน อธิบายระบบนิเวศรอบข้างของ Go เน้นการประยุกต์ใช้

ไปที่ เตรียมเริ่มต้น เพื่อเริ่มการเรียนรู้เบื้องต้น

Golang by www.golangdev.cn edit