Trong phần này, bạn sẽ sửa mã của mình để thay vì luôn trả về một lời chào duy nhất, nó sẽ trả về một trong nhiều thông điệp chào đã định nghĩa sẵn.
Lưu ý: Chủ đề này là một phần của loạt hướng dẫn nhiều phần, bắt đầu từ Tạo một Go module.
Để làm điều này, bạn sẽ dùng slice trong Go. Slice giống mảng, chỉ khác ở chỗ kích thước của nó thay đổi động khi bạn thêm và bớt phần tử. Slice là một trong những kiểu hữu dụng nhất của Go.
Bạn sẽ thêm một slice nhỏ chứa ba thông điệp chào, rồi để mã của mình trả về ngẫu nhiên một trong các thông điệp đó. Tìm hiểu thêm về slice tại Go slices trên blog của Go.
-
Trong greetings/greetings.go, sửa mã của bạn thành như sau.
package greetings import ( "errors" "fmt" "math/rand" ) // Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return name, errors.New("empty name") } // Create a message using a random format. message := fmt.Sprintf(randomFormat(), name) return message, nil } // randomFormat returns one of a set of greeting messages. The returned // message is selected at random. func randomFormat() string { // A slice of message formats. formats := []string{ "Hi, %v. Welcome!", "Great to see you, %v!", "Hail, %v! Well met!", } // Return a randomly selected message format by specifying // a random index for the slice of formats. return formats[rand.Intn(len(formats))] }Trong đoạn mã này, bạn:
- Thêm hàm
randomFormattrả về một định dạng được chọn ngẫu nhiên cho thông điệp chào. Hãy để ý rằngrandomFormatbắt đầu bằng chữ thường, nên nó chỉ truy cập được từ mã trong cùng package (nói cách khác, nó không được export). - Trong
randomFormat, khai báo sliceformatsvới ba định dạng thông điệp. Khi khai báo slice, bạn bỏ trống kích thước trong cặp ngoặc vuông, như thế này:[]string. Điều đó nói cho Go biết rằng kích thước của mảng nằm bên dưới slice có thể thay đổi động. - Dùng package
math/randđể sinh số ngẫu nhiên phục vụ việc chọn một phần tử từ slice. - Trong
Hello, gọi hàmrandomFormatđể lấy định dạng cho thông điệp sắp trả về, rồi kết hợp định dạng đó với giá trịnameđể tạo ra thông điệp. - Trả về thông điệp (hoặc lỗi) như bạn đã làm trước đó.
- Thêm hàm
-
Trong hello/hello.go, sửa mã của bạn thành như sau.
Bạn chỉ cần thêm tên Gladys (hoặc một tên khác nếu thích) làm đối số cho lời gọi hàm
Hellotrong hello.go.package main import ( "fmt" "log" "example.com/greetings" ) func main() { // Set properties of the predefined Logger, including // the log entry prefix and a flag to disable printing // the time, source file, and line number. log.SetPrefix("greetings: ") log.SetFlags(0) // Request a greeting message. message, err := greetings.Hello("Gladys") // If an error was returned, print it to the console and // exit the program. if err != nil { log.Fatal(err) } // If no error was returned, print the returned message // to the console. fmt.Println(message) } -
Tại dòng lệnh, trong thư mục hello, chạy hello.go để xác nhận mã hoạt động. Hãy chạy nhiều lần và để ý rằng lời chào thay đổi.
$ go run . Great to see you, Gladys! $ go run . Hi, Gladys. Welcome! $ go run . Hail, Gladys! Well met!
Tiếp theo, bạn sẽ dùng slice để chào nhiều người.