Cài đặt Go từ mã nguồn
Trang này mô tả cách biên dịch và chạy Go từ mã nguồn. Để cài đặt bằng trình cài đặt, xem Tải xuống và cài đặt.
Giới thiệu
Go là một dự án mã nguồn mở, phân phối theo giấy phép kiểu BSD. Tài liệu này giải thích cách lấy mã nguồn, biên dịch trên máy của bạn và chạy chúng.
Hầu hết người dùng không cần thực hiện điều này mà sẽ cài đặt từ các gói nhị phân được biên dịch sẵn như mô tả trong Tải xuống và cài đặt, một quy trình đơn giản hơn nhiều. Tuy nhiên, nếu bạn muốn tham gia phát triển những gói nhị phân đó, hãy tiếp tục đọc.
Có hai bộ công cụ biên dịch Go chính thức.
Tài liệu này tập trung vào trình biên dịch và công cụ Go gc.
Để biết cách làm việc với gccgo, một trình biên dịch truyền thống hơn
sử dụng back end của GCC, xem
Thiết lập và sử dụng gccgo.
Các trình biên dịch Go hỗ trợ các tập lệnh sau:
-
amd64,386 -
Tập lệnh
x86, 64-bit và 32-bit. -
arm64,arm -
Tập lệnh
ARM, 64-bit (AArch64) và 32-bit. -
loong64 - Tập lệnh LoongArch 64-bit.
-
mips64,mips64le,mips,mipsle -
Tập lệnh
MIPS, big-endian và little-endian, 64-bit và 32-bit. -
ppc64,ppc64le - Tập lệnh PowerPC 64-bit, big-endian và little-endian.
-
riscv64 - Tập lệnh RISC-V 64-bit.
-
s390x - Kiến trúc IBM z/Architecture.
-
wasm - WebAssembly.
Các trình biên dịch có thể nhắm đến các hệ điều hành AIX, Android, DragonFly BSD, FreeBSD, Illumos, Linux, macOS/iOS (Darwin), NetBSD, OpenBSD, Plan 9, Solaris và Windows (mặc dù không phải tất cả hệ điều hành đều hỗ trợ mọi kiến trúc).
Danh sách các cổng được coi là "hạng nhất" có tại trang wiki first class ports.
Tập hợp đầy đủ các tổ hợp được hỗ trợ được liệt kê trong phần thảo luận về biến môi trường bên dưới.
Xem trang Go Wiki MinimumRequirements để biết yêu cầu hệ thống tổng thể.
Cài đặt các tệp nhị phân trình biên dịch Go để khởi động
Bộ công cụ Go được viết bằng Go. Để biên dịch nó, bạn cần có một trình biên dịch Go đã được cài đặt.
Các script thực hiện việc biên dịch ban đầu tìm kiếm lệnh "go"
trong $PATH, vì vậy miễn là bạn đã cài đặt Go trong hệ thống
và cấu hình trong $PATH, bạn đã sẵn sàng để biên dịch Go từ mã nguồn.
Hoặc nếu muốn, bạn có thể đặt $GOROOT_BOOTSTRAP thành
thư mục gốc của một bản cài đặt Go để sử dụng biên dịch bộ công cụ Go mới;
$GOROOT_BOOTSTRAP/bin/go là lệnh go sẽ được dùng.
Phiên bản Go tối thiểu cần thiết phụ thuộc vào phiên bản Go mục tiêu:
- Go <= 1.4: một bộ công cụ C.
- 1.5 <= Go <= 1.19: trình biên dịch Go 1.4.
- 1.20 <= Go <= 1.21: trình biên dịch Go 1.17.
- 1.22 <= Go <= 1.23: trình biên dịch Go 1.20.
- Về sau, Go phiên bản 1.N sẽ yêu cầu trình biên dịch Go 1.M, trong đó M là N-2 làm tròn xuống đến số chẵn. Ví dụ: Go 1.24 và 1.25 yêu cầu Go 1.22.
Có bốn cách để lấy bộ công cụ khởi động:
- Tải xuống một bản phát hành nhị phân gần đây của Go.
- Biên dịch chéo một bộ công cụ sử dụng hệ thống đang có cài đặt Go hoạt động.
- Sử dụng gccgo.
- Biên dịch bộ công cụ từ Go 1.4, bản phát hành Go cuối cùng có trình biên dịch viết bằng C.
Các phương pháp này được mô tả chi tiết bên dưới.
Bộ công cụ khởi động từ bản phát hành nhị phân
Để sử dụng một bản phát hành nhị phân làm bộ công cụ khởi động, xem trang tải xuống hoặc sử dụng bất kỳ bản phân phối Go đóng gói nào đáp ứng yêu cầu phiên bản tối thiểu.
Bộ công cụ khởi động từ mã nguồn biên dịch chéo
Để biên dịch chéo một bộ công cụ khởi động từ mã nguồn, điều này là
cần thiết trên các hệ thống mà Go 1.4 không nhắm đến (ví dụ
linux/ppc64le), hãy cài đặt Go trên một hệ thống khác
và chạy bootstrap.bash.
Khi chạy như (ví dụ)
$ GOOS=linux GOARCH=ppc64 ./bootstrap.bash
bootstrap.bash biên dịch chéo một bộ công cụ cho tổ hợp GOOS/GOARCH đó,
để lại cây kết quả trong ../../go-${GOOS}-${GOARCH}-bootstrap.
Cây đó có thể được sao chép sang một máy có kiểu mục tiêu tương ứng
và được dùng làm GOROOT_BOOTSTRAP để khởi động một bản biên dịch cục bộ.
Bộ công cụ khởi động sử dụng gccgo
Để sử dụng gccgo làm bộ công cụ khởi động, bạn cần sắp xếp để
$GOROOT_BOOTSTRAP/bin/go là công cụ go đi kèm
với gccgo 5. Ví dụ trên Ubuntu Vivid:
$ sudo apt-get install gccgo-5 $ sudo update-alternatives --set go /usr/bin/go-5 $ GOROOT_BOOTSTRAP=/usr ./make.bash
Bộ công cụ khởi động từ mã nguồn C
Để biên dịch bộ công cụ khởi động từ mã nguồn C, sử dụng
nhánh git release-branch.go1.4 hoặc
go1.4-bootstrap-20171003.tar.gz,
chứa mã nguồn Go 1.4 cùng các bản sửa lỗi tích lũy
để giữ cho công cụ hoạt động trên các hệ điều hành mới hơn.
(Go 1.4 là bản phân phối cuối cùng mà bộ công cụ được viết bằng C.)
Sau khi giải nén mã nguồn Go 1.4, cd vào
thư mục con src, đặt CGO_ENABLED=0 trong
môi trường, và chạy make.bash (hoặc,
trên Windows, make.bat).
Sau khi giải nén mã nguồn Go 1.4 vào thư mục GOROOT_BOOTSTRAP,
bạn phải giữ bản clone git này ở nhánh
release-branch.go1.4. Cụ thể, đừng cố tái sử dụng
bản clone git này ở bước sau có tên "Fetch the repository." Bộ công cụ khởi động go1.4
phải có khả năng duyệt đúng cây mã nguồn go1.4
mà nó giả định là nằm trong thư mục gốc kho lưu trữ này.
Lưu ý rằng Go 1.4 không chạy trên tất cả các hệ thống mà các phiên bản Go sau này hỗ trợ. Đặc biệt, Go 1.4 không hỗ trợ các phiên bản macOS hiện tại. Trên những hệ thống như vậy, bộ công cụ khởi động phải được lấy bằng một trong các phương pháp khác.
Cài đặt Git (nếu cần)
Để thực hiện bước tiếp theo, bạn phải có Git đã được cài đặt. (Kiểm tra rằng bạn
có lệnh git trước khi tiếp tục.)
Nếu bạn chưa có cài đặt Git hoạt động, hãy làm theo hướng dẫn trên trang Git downloads.
(Tùy chọn) Cài đặt trình biên dịch C
Để biên dịch cài đặt Go
có hỗ trợ cgo, cho phép các chương trình Go
import thư viện C, trước tiên phải cài đặt một trình biên dịch C như gcc
hoặc clang. Hãy thực hiện bằng phương pháp cài đặt tiêu chuẩn của hệ thống.
Để biên dịch mà không có cgo, đặt biến môi trường
CGO_ENABLED=0 trước khi chạy all.bash hoặc
make.bash.
Tải kho lưu trữ về máy
Chuyển đến thư mục nơi bạn muốn cài đặt Go, và đảm bảo
thư mục goroot chưa tồn tại. Sau đó clone kho lưu trữ
và checkout tag phát hành hoặc nhánh phát hành mới nhất (go1.22.0, hoặc release-branch.go1.22,
chẳng hạn):
$ git clone https://go.googlesource.com/go goroot
$ cd goroot
$ git checkout <tag>
Trong đó <tag> là chuỗi phiên bản của bản phát hành.
Go sẽ được cài đặt trong thư mục nơi nó được checkout. Ví dụ,
nếu Go được checkout trong $HOME/goroot, các tệp thực thi sẽ được cài đặt
trong $HOME/goroot/bin. Thư mục có thể có bất kỳ tên nào, nhưng lưu ý
rằng nếu Go được checkout trong $HOME/go, nó sẽ xung đột với
vị trí mặc định của $GOPATH.
Xem GOPATH bên dưới.
Nhắc nhở: Nếu bạn đã chọn cũng biên dịch các tệp nhị phân khởi động từ mã nguồn (ở
một phần trước), bạn vẫn cần git clone lại tại điểm này
(để checkout <tag> mới nhất), vì bạn phải giữ
kho lưu trữ go1.4 của mình tách biệt.
(Tùy chọn) Chuyển sang nhánh master
Nếu bạn dự định sửa đổi mã nguồn go và đóng góp các thay đổi vào dự án, hãy chuyển kho lưu trữ của bạn khỏi tag phát hành, sang nhánh master (phát triển). Nếu không, bỏ qua bước này.
$ git checkout master
Cài đặt Go
Để biên dịch bản phân phối Go, chạy
$ cd src $ ./make.bash
(Để biên dịch trên Windows, dùng make.bat.)
Nếu mọi thứ diễn ra tốt, quá trình sẽ kết thúc bằng cách in ra:
--- Installed Go for linux/amd64 in /home/you/go. Installed commands in /home/you/go/bin. *** You need to add /home/you/go/bin to your $PATH. ***
trong đó các chi tiết trên vài dòng cuối phản ánh hệ điều hành, kiến trúc và thư mục gốc được dùng trong quá trình cài đặt.
Để biết thêm thông tin về các cách kiểm soát quá trình biên dịch, xem phần thảo luận về
biến môi trường bên dưới.
Bạn cũng có thể chạy all.bash (hoặc all.bat) để chạy
các bài kiểm thử quan trọng cho Go, có thể mất nhiều thời gian hơn so với việc chỉ biên dịch Go.
Kiểm tra cài đặt
Kiểm tra rằng Go đã được cài đặt đúng bằng cách biên dịch một chương trình đơn giản.
Tạo một tệp tên hello.go và đặt chương trình sau vào đó:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
Sau đó chạy nó bằng công cụ go:
$ go run hello.go hello, world
Nếu bạn thấy thông báo "hello, world" thì Go đã được cài đặt đúng.
Thiết lập môi trường làm việc
Bạn gần xong rồi. Chỉ cần thực hiện thêm một vài bước thiết lập.
Cách viết mã Go Tìm hiểu cách thiết lập và sử dụng các công cụ Go
Tài liệu Cách viết mã Go cung cấp hướng dẫn thiết lập cần thiết để sử dụng các công cụ Go.
Cài đặt các công cụ bổ sung
Mã nguồn của một số công cụ Go (bao gồm gopls)
được lưu trữ trong kho lưu trữ golang.org/x/tools.
Để cài đặt một trong các công cụ (gopls trong trường hợp này):
$ go install golang.org/x/tools/gopls@latest
Tài nguyên cộng đồng
Các tài nguyên cộng đồng thông thường được liệt kê trên trang trợ giúp có các nhà phát triển tích cực có thể giúp bạn giải quyết vấn đề khi cài đặt hoặc phát triển. Đối với những ai muốn cập nhật thường xuyên, còn có một danh sách thư khác, golang-checkins, nhận thông báo tóm tắt mỗi lần có commit vào kho lưu trữ Go.
Có thể báo cáo lỗi bằng trình theo dõi vấn đề Go.
Cập nhật theo các bản phát hành
Các bản phát hành mới được thông báo trên danh sách thư
golang-announce.
Mỗi thông báo đề cập đến tag phát hành mới nhất, ví dụ
go1.9.
Để cập nhật một cây nguồn đã có lên bản phát hành mới nhất, bạn có thể chạy:
$ cd go/src
$ git fetch
$ git checkout <tag>
$ ./all.bash
Trong đó <tag> là chuỗi phiên bản của bản phát hành.
Các biến môi trường tùy chọn
Các công cụ Go có thể được tùy chỉnh thông qua biến môi trường. Không có biến nào là bắt buộc khi biên dịch, nhưng bạn có thể muốn đặt một số để ghi đè các giá trị mặc định. Đặt các biến môi trường này trong khi chạy make.bash sẽ thiết lập giá trị mặc định cho bộ công cụ mới biên dịch. Khi sử dụng công cụ, bạn có thể ghi đè các giá trị mặc định này cho một bản biên dịch cụ thể, như được mô tả trong tài liệu lệnh go.
$GOROOTThư mục gốc của cây Go, thường là
$HOME/go1.X. Giá trị của nó được tích hợp vào cây khi biên dịch, và mặc định là thư mục cha của thư mục nơiall.bashđược chạy. Không cần đặt biến này trừ khi bạn muốn chuyển đổi giữa nhiều bản sao cục bộ của kho lưu trữ.$GOOSvà$GOARCHTên của hệ điều hành mục tiêu và kiến trúc biên dịch.
$GOOSmặc định theo giá trị củaruntime.GOOStrong bộ công cụ khởi động.$GOARCHmặc định theo giá trị của$GOHOSTARCH, được mô tả bên dưới.Các giá trị cho
$GOOSlàandroid,darwin,dragonfly,freebsd,illumos,ios,js,linux,netbsd,openbsd,plan9,solaris,wasip1, vàwindows.Các giá trị cho
$GOARCHlàamd64(x86 64-bit, cổng trưởng thành nhất),386(x86 32-bit),arm(ARM 32-bit),arm64(ARM 64-bit),ppc64le(PowerPC 64-bit, little-endian),ppc64(PowerPC 64-bit, big-endian),mips64le(MIPS 64-bit, little-endian),mips64(MIPS 64-bit, big-endian),mipsle(MIPS 32-bit, little-endian),mips(MIPS 32-bit, big-endian),s390x(IBM System z 64-bit, big-endian), vàwasm(WebAssembly 32-bit).Các tổ hợp hợp lệ của
$GOOSvà$GOARCHlà:$GOOS$GOARCHaixppc64android386androidamd64androidarmandroidarm64darwinamd64darwinarm64dragonflyamd64freebsd386freebsdamd64freebsdarmillumosamd64iosarm64jswasmlinux386linuxamd64linuxarmlinuxarm64linuxloong64linuxmipslinuxmipslelinuxmips64linuxmips64lelinuxppc64linuxppc64lelinuxriscv64linuxs390xnetbsd386netbsdamd64netbsdarmopenbsd386openbsdamd64openbsdarmopenbsdarm64plan9386plan9amd64plan9armsolarisamd64wasip1wasmwindows386windowsamd64windowsarmwindowsarm64$GOHOSTARCHTên của kiến trúc biên dịch trên máy chủ. Mặc định theo kiến trúc của hệ thống cục bộ.
Các giá trị hợp lệ giống như cho
$GOARCH, được liệt kê ở trên. Các giá trị được chỉ định phải tương thích với hệ thống cục bộ. Ví dụ, bạn không nên đặt$GOHOSTARCHthànharmtrên hệ thống x86.$GO386(chỉ cho386, mặc định làsse2)Biến này kiểm soát cách gc thực hiện các phép tính dấu phẩy động.
GO386=softfloat: sử dụng phép tính dấu phẩy động bằng phần mềm; hỗ trợ tất cả chip x86 (Pentium MMX trở lên).GO386=sse2: sử dụng SSE2 cho phép tính dấu phẩy động; hiệu năng tốt hơn nhưng chỉ có trên Pentium 4/Opteron/Athlon 64 trở lên.
$GOARM(chỉ choarm; mặc định được phát hiện tự động nếu biên dịch trên bộ xử lý mục tiêu, nếu không thì là 7)Biến này đặt phiên bản kiến trúc bộ đồng xử lý dấu phẩy động ARM mà thời gian chạy nên nhắm đến. Nếu bạn đang biên dịch trên hệ thống mục tiêu, giá trị sẽ được phát hiện tự động.
GOARM=5: sử dụng dấu phẩy động bằng phần mềm; khi CPU không có bộ đồng xử lý VFPGOARM=6: chỉ sử dụng VFPv1; mặc định khi biên dịch chéo; thường là nhân ARM11 trở lên (VFPv2 trở lên cũng được hỗ trợ)GOARM=7: sử dụng VFPv3; thường là nhân Cortex-A
Nếu chưa chắc, hãy để biến này không đặt và điều chỉnh nếu cần khi bạn chạy tệp thực thi Go lần đầu tiên. Trang GoARM trên wiki cộng đồng Go chứa thêm chi tiết về hỗ trợ ARM của Go.
$GOARM64(chỉ choarm64; mặc định làv8.0)Biến này đặt phiên bản kiến trúc ARM64 để biên dịch. Xem trang Go wiki MinimumRequirements để biết các tùy chọn được phép.
$GOAMD64(chỉ choamd64; mặc định làv1)Biến này đặt mức vi kiến trúc để biên dịch. Các giá trị hợp lệ là
v1(mặc định),v2,v3,v4. Xem trang Go wiki MinimumRequirements để biết thêm thông tin.$GOMIPS(chỉ chomipsvàmipsle)
$GOMIPS64(chỉ chomips64vàmips64le)Các biến này đặt xem có sử dụng lệnh dấu phẩy động hay không. Đặt thành "
hardfloat" để sử dụng lệnh dấu phẩy động; đây là giá trị mặc định. Đặt thành "softfloat" để sử dụng dấu phẩy động bằng phần mềm.$GOPPC64(chỉ choppc64vàppc64le)Biến này đặt mức bộ xử lý (tức là phiên bản Tập lệnh kiến trúc) mà trình biên dịch sẽ nhắm đến. Mặc định là
power8.GOPPC64=power8: tạo lệnh ISA v2.07GOPPC64=power9: tạo lệnh ISA v3.00
$GORISCV64(chỉ choriscv64)Biến này đặt hồ sơ ứng dụng chế độ người dùng RISC-V để biên dịch. Mặc định là
rva20u64.$GOWASM(chỉ chowasm)Biến này là danh sách các tính năng WebAssembly thử nghiệm phân cách bởi dấu phẩy mà tệp nhị phân WebAssembly được biên dịch được phép sử dụng. Mặc định là không sử dụng tính năng thử nghiệm nào.
GOWASM=satconv: tạo các phép chuyển đổi float-to-int bão hòa (không bẫy)GOWASM=signext: tạo các toán tử mở rộng dấu
Lưu ý rằng $GOARCH và $GOOS xác định
môi trường mục tiêu, không phải môi trường bạn đang chạy.
Thực chất, bạn luôn biên dịch chéo.
Theo kiến trúc, chúng tôi muốn nói đến loại tệp nhị phân
mà môi trường mục tiêu có thể chạy:
một hệ thống x86-64 đang chạy hệ điều hành chỉ 32-bit
phải đặt GOARCH thành 386,
không phải amd64.
Nhắc lại, không cần đặt bất kỳ biến nào trong số này để biên dịch, cài đặt và phát triển cây Go.