Golang Senior


🧠 1. Cách Go biên dịch và thực thi

Go không phải là ngôn ngữ thông dịch như Python hay JavaScript, mà là ngôn ngữ biên dịch tĩnh (statically compiled language). Điều này có nghĩa là:

  • Source code .go sẽ được biên dịch thành binary machine code trực tiếp bởi go build.

  • File thực thi sau khi build là self-contained binary (không cần VM hoặc runtime như Java hay .NET).

  • Việc biên dịch nhanh chóng và hiệu quả, phù hợp với DevOps và CI/CD.

👉 Ví dụ: go build tạo ra file main hoặc main.exe chạy trực tiếp mà không cần Go runtime.


🧵 2. Concurrency: Goroutines và Channel

Go sử dụng goroutines thay vì threads truyền thống.

  • Goroutine là lightweight (nhẹ hơn threads rất nhiều, chỉ vài KB stack memory ban đầu).

  • Thay vì dùng Thread.start(), Go chỉ cần go myFunc() để tạo goroutine.

  • Quản lý goroutines được điều phối bởi Go runtime scheduler, hoạt động kiểu M:N scheduling (nhiều goroutine trên ít OS threads).

Channels giúp goroutines giao tiếp một cách an toàn, không cần mutex.

func worker(ch chan string) {
    msg := <-ch
    fmt.Println("Received:", msg)
}

func main() {
    ch := make(chan string)
    go worker(ch)
    ch <- "Hello"
}

🗂️ 3. Package system và workspace

  • Go tổ chức theo package, mỗi thư mục là một package.

  • main package là entry point, phải có func main().

  • Hệ thống module (go.mod) giúp quản lý dependencies giống như package.json của Node.js.

module github.com/tai/ocop

go 1.21

require (
    github.com/gin-gonic/gin v1.9.0
)

📦 4. Garbage Collection

Go có Garbage Collector (GC) hiện đại, giúp tự động quản lý bộ nhớ.

  • GC của Go là concurrent & non-blocking (từ Go 1.18+ trở đi), cực kỳ hiệu quả với hệ thống backend cần real-time.

  • Không cần free() hoặc delete như C/C++.


5. Static typing nhưng syntax đơn giản

  • Go là statistically typed như Java, C++.

  • Nhưng không có generics (trước Go 1.18), và cú pháp tối giản:

var name string = "Tai"
age := 30 // Go tự suy luận kiểu

📚 6. Interface ngầm (Implicit Interfaces)

Go không cần implements keyword. Interface là structural typing.

type Reader interface {
    Read(p []byte) (n int, err error)
}

func process(r Reader) { ... }

// Bất kỳ struct nào có `Read` đúng signature đều là Reader, không cần khai báo implements.

🧪 7. Testing built-in

Go hỗ trợ testing trực tiếp với go test.

  • Dùng file _test.go

  • Có thể chạy benchmark, unit test, table-driven test

func TestSum(t *testing.T) {
    got := Sum(1, 2)
    want := 3
    if got != want {
        t.Errorf("got %d, want %d", got, want)
    }
}

⚙️ 8. Cross Compilation dễ dàng

Go hỗ trợ build cho các OS/architecture khác nhau rất dễ:

GOOS=linux GOARCH=amd64 go build -o app-linux
GOOS=windows GOARCH=amd64 go build -o app.exe

🛠️ 9. Tooling mạnh mẽ

  • go fmt: auto format code

  • go vet: static analysis

  • go mod: quản lý module

  • go doc, gopls: giúp tạo tài liệu và hỗ trợ IDE


💡 Tổng kết

Go hoạt động với triết lý: “Do more with less”. Không phải lúc nào cũng có nhiều tính năng như Java hay Rust, nhưng Go hướng đến sự đơn giản, dễ bảo trì, hiệu suất cao và concurrency mạnh mẽ. Đó là lý do tại sao nó rất phù hợp với backend, cloud services, microservices, DevOps và cả hệ thống phân tán.


Last updated