Đây là toàn bộ chương trình. Nhấn Chạy.
Không dòng nào trong số này là tùy chọn. Phần còn lại của trang giải thích từng dòng làm gì.
Từng dòng một
package main
Mỗi tệp Go bắt đầu bằng một mệnh đề package cho biết tệp thuộc package nào. Tên main là đặc biệt: nó đánh dấu package là một chương trình chạy được. Bất kỳ tên nào khác (package utils, package hello) tạo ra một thư viện mà code khác có thể import, nhưng không tự chạy được.
import "fmt"
import đưa một package khác vào để bạn dùng. fmt là package định dạng và in ra của thư viện chuẩn. Sau khi import, các tên được export của nó được truy cập qua tên package: fmt.Println, fmt.Printf, fmt.Sprintf.
Để import nhiều package, dùng một khối trong ngoặc tròn với mỗi đường dẫn một dòng:
import (
"fmt"
"strings"
)
Go từ chối biên dịch tệp import một package mà nó không dùng. Quy tắc đó giữ cho danh sách phụ thuộc luôn trung thực, và đây cũng là lỗi đầu tiên mà phần lớn mọi người gặp.
func main()
func khai báo một hàm (function). main trong package main là điểm bắt đầu: chương trình chạy khi main bắt đầu và kết thúc khi main trả về. Hàm này không nhận đối số và không trả về gì. Đối số dòng lệnh lấy từ os.Args, còn mã thoát đặt qua os.Exit.
fmt.Println("Hello, World!")
Println in các đối số của nó, đặt một khoảng trắng giữa chúng và thêm một ký tự xuống dòng. Tên hàm bắt đầu bằng chữ hoa vì chỉ những tên viết hoa mới được export ra khỏi package. fmt.println với chữ p thường là lỗi biên dịch.
In nhiều hơn một chuỗi
Println nhận bao nhiêu giá trị cũng được, thuộc kiểu nào cũng được. Printf cho bạn kiểm soát định dạng:
%s được thay bằng một chuỗi và %d bằng một số nguyên. Printf và Print không thêm ký tự xuống dòng, nên bạn tự viết \n. Bảng verb đầy đủ nằm ở trang fmt.Printf.
Chạy trên máy của bạn
Khi đã cài Go, lưu chương trình thành main.go trong một thư mục trống rồi chạy:
go run main.go
Hello, World!
go run biên dịch tệp thành một binary tạm rồi chạy nó. Để tạo một binary bạn có thể giữ lại và sao chép sang nơi khác, dùng go build:
go mod init example.com/hello
go build
./hello
Hello, World!
go build cần một module (một tệp go.mod), do go mod init tạo ra. Binary được đặt tên theo phần cuối của đường dẫn module, ở đây là hello (hello.exe trên Windows). Sự khác nhau giữa run, build và install được trình bày ở trang go run và go build.
Dấu chấm phẩy đã đi đâu
Ngữ pháp của Go dùng dấu chấm phẩy, nhưng bạn gần như không bao giờ phải gõ chúng. Trình biên dịch chèn một dấu vào cuối mọi dòng có token cuối có thể kết thúc một câu lệnh: một định danh, một literal, ), }, và vài từ khóa như return. Quy tắc đó là lý do kiểu viết quen thuộc từ các ngôn ngữ khác này bị lỗi:
func main()
{
fmt.Println("Hello, World!")
}
./main.go:6:1: syntax error: unexpected semicolon or newline before {
Một dấu chấm phẩy đã được chèn sau func main(), nên { ở dòng tiếp theo là lỗi. Dấu ngoặc nhọn mở luôn nằm trên cùng dòng. Quy tắc này áp dụng cho cả if, for, switch và mọi khối lệnh khác.
Giải thích những lỗi đầu tiên
Đây là những thông báo người mới thấy trong giờ đầu tiên, đúng như Go 1.24 in ra.
Một import hoặc biến không được dùng.
package main
import (
"fmt"
"os"
)
func main() {
x := 5
fmt.Println("hi")
}
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x
Cả hai đều là lỗi biên dịch, không phải cảnh báo. Hãy xóa import hoặc biến đó. Nếu cần giữ một biến trong lúc gỡ lỗi, gán nó cho định danh rỗng: _ = x.
Tên hàm viết thường.
./main.go:6:6: undefined: fmt.println
Các tên không được export thì không thấy được từ bên ngoài package của chúng. Hãy dùng fmt.Println.
Sai tên package.
package example.com/hello is not a main package
Tệp ghi package hello (hoặc bất cứ tên nào khác main) và bạn đã cố chạy nó. Đổi thành package main.
Thiếu module.
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
go build và go run . làm việc trên module. Chạy go mod init example.com/hello một lần trong thư mục. go run main.go, lệnh chỉ rõ tên tệp, chạy được mà không cần module.
Định dạng code
Go có một phong cách code chính thức, và gofmt áp dụng nó. Hãy chạy nó trên mọi tệp bạn viết:
go fmt ./...
Nó dùng tab để thụt lề, căn thẳng chú thích và các trường của struct, và chuẩn hóa khoảng trắng. Các trình soạn thảo hỗ trợ Go chạy nó mỗi khi lưu. Code Go ở đâu cũng trông giống nhau, nên không có gì phải cấu hình và không có gì phải tranh cãi khi review code.
Câu hỏi thường gặp
Viết hello world trong Go như thế nào?
Lưu đoạn code này thành main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Rồi chạy go run main.go. Chương trình in ra Hello, World!.
Vì sao chương trình Go cần package main?
package main cho trình biên dịch biết package này là một chương trình chạy được chứ không phải thư viện. Chương trình bắt đầu tại hàm main của package main. Bất kỳ tên package nào khác đều tạo ra một thư viện, và go run từ chối nó với thông báo "is not a main package".
Vì sao dấu ngoặc nhọn mở trong Go phải nằm cùng dòng?
Go tự động chèn dấu chấm phẩy vào cuối những dòng có thể kết thúc một câu lệnh, kể cả sau func main(). Khi đó, một { ở dòng tiếp theo sẽ mở ra một khối lệnh riêng, nên trình biên dịch báo syntax error: unexpected semicolon or newline before {. Dấu ngoặc nhọn phải nằm trên cùng dòng.
fmt trong Go nghĩa là gì?
fmt là package của thư viện chuẩn dùng cho đầu vào và đầu ra có định dạng (tên này là viết tắt của "format"). fmt.Println in các đối số với khoảng trắng ở giữa và một ký tự xuống dòng ở cuối; fmt.Printf in theo một chuỗi định dạng.