Ôn tập: hình dạng và hành vi
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 19 trên 68.
Thử thách
DễTrong thử thách này, bạn sẽ tạo một hệ thống giao tiếp thể hiện tính đa hình (polymorphism) thông qua các giao diện (interface). Bạn sẽ xây dựng giao diện Speaker và triển khai giao diện này bằng các kiểu khác nhau, mỗi kiểu có cách "speak" riêng.
Bạn sẽ nhận ba đầu vào:
- Một chuỗi biểu thị số lượng người nói cần tạo (ví dụ:
"3") - Một chuỗi chứa các kiểu người nói, được phân tách bằng dấu phẩy (ví dụ:
"person,parrot,person") - Một chuỗi chứa tên người nói, được phân tách bằng dấu phẩy (ví dụ:
"Alice,Polly,Bob")
Nhiệm vụ của bạn là:
- Định nghĩa giao diện
Speakervới một chữ ký phương thức:Speak(), trả về một chuỗi - Định nghĩa cấu trúc
Personvới một trườngName(chuỗi) - Định nghĩa cấu trúc
Parrotvới một trườngName(chuỗi) - Triển khai phương thức
Speak()cho cả hai cấu trúc:- Person cần trả về:
"Hello, I'm [name]" - Parrot cần trả về:
"Squawk! [name] says hello!"
- Person cần trả về:
- Tạo một hàm có tên
makeAllSpeak, nhận một lát cắt các giao diệnSpeakerlàm tham số - Bên trong
makeAllSpeak, lặp qua lát cắt, gọi phương thứcSpeak()trên từng người nói và in ra kết quả - Phân tích các đầu vào để tạo các đối tượng người nói phù hợp dựa trên kiểu và tên đã cho
- Lưu tất cả người nói trong một lát cắt các giao diện
Speaker - Gọi
makeAllSpeakvới lát cắt người nói của bạn
Các người nói cần được tạo theo thứ tự xuất hiện trong đầu vào. Ví dụ: nếu các kiểu là "person,parrot,person" và tên là "Alice,Polly,Bob", hãy tạo một Person tên Alice, rồi một Parrot tên Polly, sau đó là một Person tên Bob. Thử thách này cho thấy các kiểu khác nhau có thể được xử lý thống nhất thông qua một giao diện chung, qua đó minh họa sức mạnh của tính đa hình trong Go.
Tự làm thử
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Đọc đầu vào
var numSpeakersStr string
var speakerTypesStr string
var speakerNamesStr string
fmt.Scanln(&numSpeakersStr)
fmt.Scanln(&speakerTypesStr)
fmt.Scanln(&speakerNamesStr)
// Phân tích đầu vào
numSpeakers, _ := strconv.Atoi(numSpeakersStr)
speakerTypes := strings.Split(speakerTypesStr, ",")
speakerNames := strings.Split(speakerNamesStr, ",")
// TODO: Viết code của bạn bên dưới
// 1. Định nghĩa interface Speaker
// 2. Định nghĩa các struct Person và Parrot
// 3. Triển khai phương thức Speak() cho cả hai struct
// 4. Tạo hàm makeAllSpeak
// 5. Tạo các đối tượng Speaker dựa trên đầu vào và lưu vào một slice
// 6. Gọi makeAllSpeak với slice của bạn
}Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online