Go Lang — Đơn Giản, Nhanh, Hiệu Quả Cho Backend
Tìm hiểu Go: goroutines, channels, interface, và lý do nó trở thành ngôn ngữ backend được yêu thích.
Go (Golang) là ngôn ngữ do Google phát triển, được thiết kế cho hệ thống phân tán và microservices. Nó đơn giản, nhanh, và cực kỳ hiệu quả cho backend.
Tại Sao Go?#
- Đơn giản — Không class, không kế thừa, không generics (trước 1.18)
- Nhanh — Biên dịch ra binary, gần tốc độ C
- Concurrency built-in — Goroutines nhẹ hơn thread rất nhiều
- Deploy dễ — Build ra 1 file binary, không cần runtime
Cú Pháp Cơ Bản#
package main
import "fmt"
func main() {
// Variable
name := "Alice" // type inference
var age int = 30 // explicit type
const pi = 3.14
// If
if age > 18 {
fmt.Println("Adult")
}
// For — Go chỉ có for, không while
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// For range
nums := []int{1, 2, 3}
for index, value := range nums {
fmt.Println(index, value)
}
// Switch — không cần break
switch age {
case 20:
fmt.Println("Twenty")
default:
fmt.Println("Other")
}
}goStruct & Interface#
// Struct — giống class nhưng không có kế thừa
type User struct {
ID int
Name string
Email string
}
// Method
func (u User) Greet() string {
return "Hello, " + u.Name
}
// Pointer receiver — có thể modify
func (u *User) UpdateEmail(email string) {
u.Email = email
}
// Interface — implicit implementation
type Greeter interface {
Greet() string
}
// User tự động implement Greeter vì có method Greet()
var g Greeter = User{Name: "Bob"}
fmt.Println(g.Greet())goError Handling — Không Exception#
func Divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := Divide(10, 0)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
}goGoroutines & Channels — Concurrency Mạnh Mẽ#
func main() {
// Goroutine — chạy hàm trong một goroutine mới
go func() {
fmt.Println("Running in goroutine")
}()
// Channel — giao tiếp giữa các goroutine
ch := make(chan string)
go func() {
ch <- "Hello from goroutine"
}()
msg := <-ch
fmt.Println(msg)
time.Sleep(time.Second)
}goVí dụ Thực Tế — Fetch Nhiều URL#
func fetch(url string, ch chan<- string) {
resp, err := http.Get(url)
if err != nil {
ch <- fmt.Sprintf("%s: %v", url, err)
return
}
ch <- fmt.Sprintf("%s: %d", url, resp.StatusCode)
}
func main() {
urls := []string{
"https://google.com",
"https://github.com",
"https://example.com",
}
ch := make(chan string)
for _, url := range urls {
go fetch(url, ch)
}
for range urls {
fmt.Println(<-ch)
}
}goStandard Library — Mạnh, Không Cần Framework#
// HTTP Server
package main
import (
"encoding/json"
"log"
"net/http"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
http.HandleFunc("/api/users", func(w http.ResponseWriter, r *http.Request) {
users := []User{{1, "Alice"}, {2, "Bob"}}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(users)
})
log.Println("Server starting on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}goGo Module#
# Khởi tạo module
go mod init myapp
# Thêm dependency
go get github.com/gorilla/mux
# Download dependencies
go mod download
# Build
go build -o myapp .
# Chạy
./myappbashGo vs Các Ngôn Ngữ Khác#
| Go | Node.js | Python | |
|---|---|---|---|
| Performance | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| Concurrency | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| Learning curve | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Deploy | 1 binary | Need Node runtime | Need Python + packages |
Kết Luận#
Go là lựa chọn tuyệt vời cho:
- REST API / Microservices
- CLI tools
- Network services (proxy, load balancer)
- DevOps tooling (Docker, Kubernetes, Terraform viết bằng Go)
Nếu bạn cần performance, concurrency, và deploy đơn giản — Go là câu trả lời.