Bối cảnh: Tại sao cần setup Go đúng cách ngay từ đầu?
Lần đầu mình cài Go trên Fedora, mình chỉ gõ sudo dnf install golang rồi bắt đầu code luôn. Mọi thứ tưởng ổn cho đến khi cần build một binary yêu cầu Go 1.22+, trong khi repo Fedora vẫn còn version cũ hơn vài bậc. Rồi cái môi trường VS Code thì extension không nhận được GOPATH, debugger từ chối làm việc, gopls cứ crash liên tục. Mất cả buổi tối hôm đó để tìm ra nguyên nhân.
Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package — nhưng với Go, cách cài từ DNF không phải lúc nào cũng cho bạn version mới nhất. Khoảng cách 1-2 version nghe có vẻ nhỏ, nhưng Go release đều theo 6 tháng/lần và mỗi version thường có cải thiện đáng kể về performance lẫn syntax mới. Bài này mình sẽ hướng dẫn setup đúng cách để không bao giờ gặp lại cái cảm giác “sao build không được” lúc 2 giờ sáng nữa.
Vấn đề với cách cài từ DNF
Fedora repo thường đi sau Go official release 1-2 version. Nếu project yêu cầu Go 1.23 mà DNF chỉ có 1.21, bạn sẽ gặp lỗi build mà không hiểu tại sao. Ngoài ra, cấu trúc thư mục khi cài từ DNF đôi khi không đúng với cái VS Code extension mong đợi — GOROOT bị trỏ sai, extension loay hoay tìm không ra binary.
Cài đặt Go SDK chính chủ từ golang.org
Bước 1: Tải Go phiên bản mới nhất
Truy cập go.dev/dl để lấy link download mới nhất. Hoặc dùng lệnh dưới để kiểm tra version stable hiện tại:
# Kiểm tra version stable mới nhất
curl -s https://go.dev/VERSION?m=text
# Download — thay VERSION bằng version thực tế (ví dụ: go1.23.5)
wget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
Bước 2: Cài đặt vào /usr/local
# Xóa bản Go cũ nếu đã có (bước này quan trọng, bỏ qua là dính lỗi conflict)
sudo rm -rf /usr/local/go
# Giải nén vào /usr/local
sudo tar -C /usr/local -xzf go1.23.5.linux-amd64.tar.gz
# Verify thư mục đã có
ls /usr/local/go/bin/
# Output: go gofmt
Bước 3: Cấu hình PATH trong shell profile
Thêm vào cuối file ~/.bashrc (hoặc ~/.zshrc nếu bạn dùng zsh):
cat >> ~/.bashrc << 'EOF'
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF
# Reload ngay lập tức
source ~/.bashrc
# Verify
go version
# Output: go version go1.23.5 linux/amd64
Nếu vẫn báo command not found, kiểm tra PATH xem có đúng không:
echo $PATH | tr ':' '\n' | grep go
Một gotcha hay gặp: nếu bạn SSH vào máy qua login shell, cần thêm vào ~/.bash_profile thay vì ~/.bashrc — hai file này được load ở hai context khác nhau.
Cấu hình VS Code cho Go development
Cài extension Go chính thức
Mở VS Code, vào Extensions (Ctrl+Shift+X), tìm “Go” của publisher “Go Team at Google”. Đây là extension chính thức, đừng cài nhầm mấy cái fork tên tương tự.
Sau khi cài xong, mở một file .go bất kỳ. VS Code sẽ popup thông báo cài thêm các Go tools. Click Install All — bao gồm gopls (language server), dlv (Delve debugger), staticcheck, và goimports.
# Nếu muốn cài thủ công qua terminal (hoặc nếu popup không hiện)
go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@latest
go install honnef.co/go/tools/cmd/staticcheck@latest
go install golang.org/x/tools/cmd/goimports@latest
Cấu hình settings.json cho VS Code
Mở VS Code settings (Ctrl+,), chuyển sang JSON view (icon góc trên bên phải), thêm các cấu hình sau:
{
"go.goroot": "/usr/local/go",
"go.gopath": "/home/YOUR_USERNAME/go",
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "staticcheck",
"go.formatTool": "goimports",
"go.useLanguageServer": true,
"[go]": {
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
}
Thay YOUR_USERNAME bằng username thực của bạn (dùng whoami để lấy). Sau khi lưu, restart VS Code hoàn toàn — đừng chỉ reload window, gopls cần khởi động lại từ đầu mới nhận đúng GOROOT.
Tạo project Go đầu tiên để kiểm tra
# Tạo thư mục project
mkdir -p ~/projects/hello-go && cd ~/projects/hello-go
# Khởi tạo Go module
go mod init hello-go
Tạo file main.go:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello from Go %s!\n", runtime.Version())
fmt.Printf("OS: %s, Arch: %s\n", runtime.GOOS, runtime.GOARCH)
}
# Chạy thử
go run main.go
# Output:
# Hello from Go go1.23.5!
# OS: linux, Arch: amd64
Setup Debug với Delve trong VS Code
Tạo file .vscode/launch.json trong thư mục project:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Go App",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
Đặt breakpoint bằng cách click vào lề trái của dòng code, rồi nhấn F5 để start debug session. Nếu Delve báo lỗi permission liên quan đến ptrace, đây là vấn đề đặc thù của Fedora với kernel security hardening — không phải lỗi cài đặt:
# Fix lỗi ptrace tạm thời (reset sau reboot)
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
# Fix vĩnh viễn
sudo tee /etc/sysctl.d/10-ptrace.conf << 'EOF'
kernel.yama.ptrace_scope = 0
EOF
# Apply ngay không cần reboot
sudo sysctl --system
Kiểm tra & Monitoring môi trường Go
Verify toàn bộ cài đặt
# Kiểm tra Go environment — các giá trị quan trọng cần check
go env GOROOT GOPATH GOMODCACHE GOPROXY
# Output mong đợi:
# GOROOT=/usr/local/go
# GOPATH=/home/username/go
# GOMODCACHE=/home/username/go/pkg/mod
# GOPROXY=https://proxy.golang.org,direct
# Kiểm tra các tools đã cài
which gopls && gopls version
which dlv && dlv version
which staticcheck && staticcheck --version
Chạy test để confirm mọi thứ hoạt động
# Tạo file test trong project hello-go
cat > main_test.go << 'EOF'
package main
import "testing"
func TestVersion(t *testing.T) {
got := "hello-go"
want := "hello-go"
if got != want {
t.Errorf("got %q, want %q", got, want)
}
}
EOF
# Chạy test
go test -v ./...
# Output:
# --- PASS: TestVersion (0.00s)
# PASS
Script update Go khi có version mới
Điểm hay khi cài theo cách này là update rất đơn giản — không cần lo conflict với DNF:
#!/bin/bash
# Lưu thành ~/bin/update-go.sh
NEW_VERSION="go1.24.0" # Thay bằng version muốn cài
wget https://go.dev/dl/${NEW_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf ${NEW_VERSION}.linux-amd64.tar.gz
rm ${NEW_VERSION}.linux-amd64.tar.gz
go version
Các lỗi thường gặp và cách fix nhanh
- gopls không nhận GOROOT: Restart VS Code hoàn toàn sau khi edit settings.json — reload window không đủ.
- go: command not found sau khi thêm PATH: Chạy
source ~/.bashrchoặc mở terminal mới. Nếu dùng login shell qua SSH thì thêm vào~/.bash_profile. - Delve crash với “operation not permitted”: Fix
ptrace_scopenhư hướng dẫn ở trên — rất phổ biến trên Fedora do kernel hardening mặc định. - VS Code không format code khi save: Cài lại
goimportsthủ công và đảm bảoGOPATH/binđã có trong PATH của VS Code terminal.
Sau khi setup xong, bạn có một môi trường Go solid: language server với autocomplete đầy đủ, formatter tự động khi save, debugger hoạt động với breakpoint, và test runner sẵn sàng. Từ đây bắt đầu build REST API, CLI tools hay microservice đều được — không cần lo môi trường nữa.

