Thiết lập môi trường Go (Golang) chuyên nghiệp trên Fedora: Cài đặt SDK, VS Code và Debug từ đầu

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

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 ~/.bashrc hoặ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_scope như 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 goimports thủ công và đảm bảo GOPATH/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.

Share: