Skip to content

Hướng dẫn bắt đầu với Go

Bài viết này sẽ hướng dẫn bạn cách bắt đầu học ngôn ngữ Go, chỉ xét về mặt cú pháp thì nó không khó học, bạn có thể làm quen trong vòng vài ngày. Tuy nhiên theo thông lệ, trước khi chính thức bắt đầu, chúng ta cần tìm hiểu về bối cảnh và nguồn gốc của nó.

Bối cảnh

Ngôn ngữ Go được tạo ra bởi ba đại lão, họ lần lượt là

  • Ken Thompson, người đoạt giải Turing, người sáng lập hệ thống Unix, người sáng lập ngôn ngữ B, người sáng lập ngôn ngữ C
  • Rob Pike, một trong những tác giả của hệ điều hành Plan9, một trong những người phát minh ra UTF-8, người đứng đầu thiết kế ngôn ngữ Go
  • Robert Griesemer, nhà phát triển JS V8, người trẻ nhất trong ba người

Còn có một người nữa là Renee French, vợ của Rob Pike, bà đã thiết kế Logo của ngôn ngữ Go, là một con chuột chũi màu xanh.

Vào một ngày nọ, trong quá trình chờ đợi biên dịch dự án C++ dài đằng đẵng, ba kỹ sư cảm thấy vô cùng nhàm chán, chính vào khoảnh khắc này, Rob Pike bỗng lóe lên một ý tưởng mới lạ: ông hy vọng thiết kế một ngôn ngữ lập trình đơn giản, nhỏ gọn, biên dịch nhanh, đồng thời có hiệu suất không tệ, như vậy họ sẽ không cần phải chờ đợi lâu mỗi lần biên dịch. Sau một hồi brainstorm ngắn, ba người đã tổ chức một cuộc họp ngắn vào ngày 20 tháng 9 năm 2007, bắt đầu thảo luận và thiết kế nguyên mẫu sơ khai của ngôn ngữ này, chính từ khoảnh khắc này, ngôn ngữ Go chính thức ra đời. Sau đó, nhóm nhỏ này đã thu hút ngày càng nhiều nhà phát triển cùng chí hướng, cuối cùng vào ngày 10 tháng 11 năm 2009, công ty Google chính thức mở nguồn Go với giấy phép BSD-3-Clause, và ra mắt phiên bản đầu tiên, đồng thời thành lập nhóm phát triển chính thức.

Lưu ý

Bạn có thể thấy ở những nơi khác có người gọi nó là Golang, bao gồm cả tên kho Github của trang web này cũng gọi là Golang-Doc, nhưng tên chính thức của nó thực ra luôn là Go, vào thời kỳ đầu do tên miền go bị đăng ký trước, nên tên miền trang web đã dùng golang.org, dẫn đến những người mới sau này hiểu nhầm rằng nó tên là Golang.

Đây là giao diện ban đầu của trang web chính thức

Sau đó, nhóm Go sau ba năm thiết kế và phát triển, đã phát hành phiên bản chính thức đầu tiên Go1.0 vào tháng 3 năm 2012 (lúc này công cụ và runtime của Go vẫn được viết bằng ngôn ngữ C, cho đến Go1.5 mới hoàn thành self-hosting), sau đó mỗi năm phát hành hai phiên bản nhỏ cập nhật, duy trì và vận hành cho đến nay.

Ba người sáng lập thực ra đã rút lui từ rất lâu, trong phần lớn thời gian, người đứng đầu nhóm là Russ Cox, ông đã tham gia vào công việc phát triển từ trước khi Go được công bố, sau đó quản lý nhóm Go trong 12 năm, cho đến tháng 8 năm 2024 khi ông từ chức, do Austin Clements tiếp quản và lãnh đạo công việc phát triển sau này.

Nếu bạn muốn tìm hiểu sâu hơn về lịch sử của ngôn ngữ Go, hãy truy cập Go History để biết thêm nội dung.

Đặc điểm

  • Cú pháp đơn giản Ngôn ngữ Go đã cân nhắc giữa tự do và linh hoạt, đổi lại khả năng bảo trì tốt hơn và đường cong học tập mượt mà.
  • Triển khai thân thiện Các tệp nhị phân sau khi biên dịch tĩnh của Go không phụ thuộc vào môi trường runtime bổ sung, tốc độ biên dịch cũng rất nhanh.
  • Biên dịch chéo Go chỉ cần thiết lập đơn giản hai tham số khi biên dịch, là có thể biên dịch ra chương trình có thể chạy trên các nền tảng khác
  • Đồng thời tự nhiên Go có hỗ trợ đồng thời ở cấp độ ngôn ngữ, chỉ cần một từ khóa, là có thể khởi động một goroutine bất đồng bộ.
  • Thu gom rác Go có hiệu năng GC xuất sắc, trong hầu hết các trường hợp độ trễ GC không vượt quá 1 mili giây.
  • Thư viện chuẩn phong phú Từ xử lý chuỗi đến phân tích cú pháp AST mã nguồn, thư viện chuẩn mạnh mẽ và phong phú là nền tảng vững chắc của ngôn ngữ Go.
  • Công cụ hoàn thiện Go có công cụ phát triển hoàn thiện, bao gồm biên dịch, kiểm thử, quản lý phụ thuộc, phân tích hiệu suất và nhiều khía cạnh khác.

Ngôn ngữ Go đã từ bỏ kế thừa, làm yếu OOP, các đặc tính như lớp, meta programming, generic, Lambda expression, v.v., có hiệu suất tốt và độ khó tiếp cận thấp, nó phù hợp cho phát triển dịch vụ đám mây, phát triển máy chủ ứng dụng, và lập trình mạng. Nó đi kèm GC, không cần nhà phát triển quản lý bộ nhớ thủ công, biên dịch tĩnh và biên dịch chéo cũng rất thân thiện với vận hành.

Nhược điểm của ngôn ngữ Go cũng có rất nhiều, như xử lý lỗi bị chỉ trích, generic không hoàn chỉnh, thư viện chuẩn tuy phong phú nhưng cấu trúc dữ liệu built-in lại không có mấy, kiểu interface{} bay đầy trời, không có kiểu enum, ngoài ra, nhóm phát triển Go rất cố chấp, không善于 lắng nghe ý kiến cộng đồng, v.v. (So sánh thì, Rust làm tốt hơn nhiều trong xử lý lỗi, generic, quản lý phụ thuộc, enum, interface, v.v.)

Nói chung, chúng ta cần nhìn nhận một ngôn ngữ một cách biện chứng, là một ngôn ngữ kỹ thuật hóa, Go có thể nâng cao đáng kể giới hạn dưới của nhóm, ngay cả khi trình độ nhân viên phát triển kém cũng có thể chống đỡ, hiếm khi xảy ra tình trạng một con chuột làm hỏng cả nồi cháo, đồng thời vì cú pháp đơn giản và độ khó học tập thấp, có thể khiến người ta nhanh chóng làm quen một dự án. Mặc dù Go ra đời chỉ hơn mười năm, nhưng đã có khá nhiều công ty chọn Go làm ngôn ngữ ưu tiên, cũng có thể gián tiếp cho thấy Go đang dần phổ biến.

Nhân tiện, Go còn là một ngôn ngữ hoàn toàn mở nguồn, do cộng đồng và Google cùng duy trì sự phát triển của ngôn ngữ Go, địa chỉ chính thức nằm trong kho lưu trữ của Google, trên Github có một kho lưu trữ mirror tương tự, nếu có tâm bạn cũng có thể tham gia vào thiết kế ngôn ngữ.

Trang web chính thức: The Go Programming Language

Kho lưu trữ mở nguồn của Google: google/go: Google Open Source

Kho Github: golang/go: The Go programming language

TIP

Tác giả từng gửi PR cho Go, nếu bạn muốn biết cách đóng góp mã cho Go, có thể xem bài viết tôi viết: Cách đóng góp mã cho Go.

Tin rằng nhiều người ít nhiều đã nghe nói về Rust, nó là một ngôn ngữ lập trình đa dụng hiệu năng cao, thời gian ra đời sớm hơn Go một năm, thời gian phát hành chính thức của Go1 là năm 2012, thời gian phát hành chính thức của Rust là năm 2015, chúng đều là những ngôn ngữ hiện đại, hai ngôn ngữ này tác giả đều rất thích, lĩnh vực phát triển của chúng khác nhau, nếu bạn không hài lòng với hiệu suất chạy và khả năng biểu đạt của Go,不妨 thử Rust, nhưng độ khó học tập của nó thì không đơn giản như Go.

Cài đặt

Tải xuống Go: Downloads - The Go Programming Language

Stable Version đề cập đến hai phiên bản ổn định hiện đang được bảo trì, Archived Version đề cập đến các phiên bản lịch sử không còn được bảo trì, truy cập Nhật ký cập nhật để biết thêm thông tin về quy tắc bảo trì và các phiên bản lịch sử.

Windows

Đối với nền tảng Windows, có hai loại installer và archive để lựa chọn, cái trước là gói cài đặt, chỉ cần click click, khuyến nghị sử dụng cái sau, sẽ giúp bạn làm quen hơn với cấu trúc thư mục của ngôn ngữ Go, sau này có vấn đề cũng không đến mức bối rối. Chọn tải xuống tệp zip, tệp nén bao gồm mã nguồn của ngôn ngữ Go cùng với công cụ và một số tài liệu, giải nén nó vào đường dẫn được chỉ định, sau đó cần cấu hình hai biến môi trường hệ thống.

  • GOROOT - Đường dẫn cài đặt của ngôn ngữ Go
  • GOPATH - Đường dẫn lưu trữ phụ thuộc của ngôn ngữ Go

Sau khi thiết lập xong, thêm hai mục mới vào biến môi trường hệ thống PATH

  • %GOROOT%\bin: Đây là địa chỉ chương trình nhị phân của go
  • %GOPATH%\bin: Đây là địa chỉ lưu trữ các tệp nhị phân của phụ thuộc bên thứ ba sẽ được tải xuống trong tương lai

Thực thi lệnh go version trong powershell, cuối cùng có thể hiển thị phiên bản bình thường thì chứng tỏ cài đặt đúng.

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

Cập nhật chỉ cần tải xuống zip mới và ghi đè lên thư mục cài đặt gốc là được.

Linux

Lấy ubuntu làm ví dụ, sao chép liên kết của phiên bản bạn muốn, tải xuống local

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

Giải nén vào thư mục được chỉ định

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

Thiết lập biến môi trường trong tệp $HOME/.bashrc

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

Sau khi hoàn thành xem phiên bản cài đặt, xác nhận cài đặt đúng

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

Cập nhật chỉ cần tải xuống tar.gz mới và ghi đè lên thư mục cài đặt gốc là được.

Quản lý cài đặt

Cách cài đặt trên đã đủ cho sử dụng cơ bản, cá nhân khuyến nghị dùng cấu trúc thư mục sau để lưu trữ ngôn ngữ Go và các tệp dẫn xuất của nó

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

Giải thích như sau

  • Thư mục go/root dùng để lưu trữ các phiên bản mã nguồn của ngôn ngữ Go
  • go/mod tương ứng với GOAPTH
  • go/mod/libs tương ứng với GOMODCACHE, tức là địa chỉ lưu trữ các phụ thuộc bên thứ ba đã tải xuống
  • go/mod/bin tương ứng với GOBIN, địa chỉ lưu trữ các tệp nhị phân của phụ thuộc bên thứ ba
  • go/cache, tương ứng với GOCACHE, lưu trữ các tệp cache
  • go/temp, tương ứng với GOTMPDIR, lưu trữ các tệp tạm thời
  • go/env, tương ứng với GOENV, tệp cấu hình biến môi trường toàn cục

Cách này khi cập nhật không cần ghi đè lên thư mục cài đặt gốc, chỉ cần lưu trữ nó vào thư mục go/root, sau đó sửa đổi biến môi trường hệ thống GOROOT thành thư mục của phiên bản được chỉ định trong thư mục đó là được. Trong trường hợp mặc định tệp env được đọc từ đường dẫn GOROOT/env, thông qua thiết lập biến hệ thống GOENV tách nó khỏi GOROOT, tránh thay đổi cấu hình biến môi trường go do thay đổi phiên bản, dưới đây là thiết lập ban đầu của tệp env.

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

Đây chỉ là một phong cách thư mục mà tác giả thích, truy cập Lệnh-Biến môi trường để biết thêm thông tin về biến môi trường, bạn có thể hoàn toàn tùy chỉnh theo sở thích cá nhân.

Quản lý đa phiên bản

Tôi đã viết một công cụ quản lý đa phiên bản govm, kết hợp với cấu trúc thư mục trên sử dụng hiệu quả nhất. Nó có thể quản lý nhiều phiên bản Go local, có thể chuyển đổi phiên bản bất cứ lúc nào, cũng có thể tìm kiếm và tải xuống các phiên bản Go khác và cài đặt chúng vào local.

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

# Đăng nhập lại shell
$ go version
go version go1.22.4 windows/amd64

Nếu bạn muốn biết cách viết công cụ dòng lệnh bằng Go, không ngại thì có thể lấy govm làm tài liệu tham khảo dự án, nó cũng được viết bằng Go.

Trình soạn thảo

IDE Go chính thống hiện tại cá nhân chỉ khuyến nghị hai cái sau

  1. goland: do jetbrain sản xuất, chức năng mạnh mẽ, hỗ trợ toàn diện, nhưng cần trả phí, có thể cân nhắc IDEA phiên bản cộng đồng kết hợp với plugin
  2. vscode: Không cần trả phí, trình soạn thảo vạn năng, có plugin hỗ trợ viết được mọi ngôn ngữ

Nếu có trình soạn thảo khác phù hợp hơn với thói quen sử dụng của bản thân cũng đều có thể dùng, dùng trình soạn thảo nào cũng không quan trọng, nếu chỉ viết một số mã luyện tập ngắn, có thể thử goplay do chính thức cung cấp, có thể chạy mã go trực tuyến.

TIP

Nếu bạn đang sử dụng JetBrains Toolbox, có thể thử công cụ dòng lệnh tôi viết AutoToolBox, có thể tạo menu chuột phải windows cho Toolbox, hình ảnh hiệu quả như sau.

Lời nhắn

Độ khó tổng thể của Go không cao, nếu bạn có nền tảng ngôn ngữ khác thì học sẽ rất đơn giản, trong quá trình học gặp những điểm khó không hiểu có thể bỏ qua trước, học bất kỳ ngôn ngữ nào cũng là trước hết tìm hiểu tổng quát cú pháp và cấu trúc của ngôn ngữ đó, rồi mới đi sâu vào một số đặc tính và chi tiết,理念 trong tài liệu cũng như vậy, phù hợp cho học tập nhập môn. Bản thân tác giả cũng chỉ là một học sinh bình thường, khó tránh khỏi có sơ suất và sai sót, nếu phát hiện bất kỳ lỗi nào có thể提交 PR trên Github, nếu thấy tài liệu还不错 có thể cho một Star trên Github.

Nếu bạn là nhà phát triển ngôn ngữ OOP mạnh, như Java, C#, v.v., đừng mang tư tưởng OOP để tiên nhập为主, nếu không sẽ cảm thấy rất nhiều thiết kế của go khó hiểu, khi viết mã cũng sẽ rất khó chịu, tác giả ban đầu cũng như vậy.

Tổng quan

Dưới đây là giới thiệu đơn giản về nội dung của trang web này, để các bạn có thể đọc theo nhu cầu, một số trang là空白 đại diện cho chưa cập nhật.

  • Nhập môn ngôn ngữ: Chủ yếu giải thích về nội dung của chính ngôn ngữ Go, thiên về lý thuyết.
    • Cơ bản cú pháp: Chủ yếu nói về một số cú pháp rất cơ bản, như quy tắc cú pháp if, for, v.v.
    • Nâng cao cú pháp: Nói về một số thứ độc đáo của Go, về mô-đun, kiểm thử, goroutine và các nội dung liên quan.
    • Thư viện chuẩn: Giới thiệu đơn giản về thư viện chuẩn đi kèm của Go, vì nội dung thư viện chuẩn thực sự quá lớn nên tùy duyên cập nhật.
    • Nguyên lý triển khai: Chủ yếu nói về một số nguyên lý thiết kế nội bộ của ngôn ngữ Go, như lập lịch goroutine, quản lý bộ nhớ, thu gom rác, v.v.
  • Hệ sinh thái cộng đồng: Chủ yếu giải thích về hệ sinh thái xung quanh Go, thiên về ứng dụng.

Đi đến Bắt đầu chuẩn bị để học nhập môn

Golang by www.golangdev.cn edit