Ôn tập: sổ liên lạc
Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 18 trên 107.
Thử thách
DễHãy xây dựng một hệ thống sổ liên lạc kết hợp các kiểu tùy chỉnh, struct lồng nhau, thẻ struct và giá trị zero, tức là tất cả các khái niệm bạn đã nắm vững trong chương này.
Bạn sẽ sắp xếp code trong hai tệp:
contact.go: Định nghĩa mô hình dữ liệu sổ liên lạc với các kiểu tùy chỉnh có ý nghĩa và định dạng JSON phù hợp:- Tạo các kiểu tùy chỉnh
PhonevàEmaildựa trênstringđể code tự mô tả - Định nghĩa struct
Addressvới các trườngStreet,CityvàCountry, mỗi trường có thẻ JSON phù hợp - Định nghĩa struct
ContactgồmName(string),Phone(kiểu Phone của bạn),Email(kiểu Email của bạn) vàAddress(struct lồng nhau). Dùng thẻ JSON để bỏ quaphonevàemailnếu chúng trống
- Tạo các kiểu tùy chỉnh
main.go: Đọc thông tin liên lạc từ đầu vào, tạo một đối tượng Contact và xuất dữ liệu dưới dạng JSON có định dạng. Một số liên hệ có thể thiếu thông tin: hãy để các giá trị zero vàomitemptyxử lý những trường hợp đó một cách phù hợp.
Đầu vào sẽ gồm:
- Dòng 1: Tên liên hệ
- Dòng 2: Số điện thoại (có thể để trống)
- Dòng 3: Địa chỉ email (có thể để trống)
- Dòng 4: Địa chỉ đường phố
- Dòng 5: Thành phố
- Dòng 6: Quốc gia
Dùng json.MarshalIndent với hai dấu cách để thụt lề. In ra chuỗi JSON kết quả.
Ví dụ, nếu đầu vào là một liên hệ có tên Alice Smith, không có số điện thoại, email alice@example.com, địa chỉ đường phố 123 Main St, thành phố Boston và quốc gia USA, đầu ra sẽ trông như sau:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Hãy chú ý rằng trường phone hoàn toàn không xuất hiện vì trường này để trống: đó là tác dụng của thẻ omitempty!
Tự làm thử
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Đọc tên
scanner.Scan()
name := scanner.Text()
// Đọc số điện thoại (có thể để trống)
scanner.Scan()
phone := scanner.Text()
// Đọc email (có thể để trống)
scanner.Scan()
email := scanner.Text()
// Đọc tên đường
scanner.Scan()
street := scanner.Text()
// Đọc thành phố
scanner.Scan()
city := scanner.Text()
// Đọc quốc gia
scanner.Scan()
country := scanner.Text()
// TODO: Tạo một instance Contact bằng các giá trị đầu vào
// Dùng các kiểu dữ liệu tùy chỉnh Phone và Email cho các trường tương ứng
// Tạo struct Address lồng nhau với street, city và country
// TODO: Dùng json.MarshalIndent để chuyển contact thành JSON
// Dùng "" làm tiền tố và " " (hai dấu cách) để thụt lề
// TODO: In ra chuỗi JSON
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng OOP trong Go
Tệp bên ngoàiWorkspace và module trong GoPackage và importTên được export và không được exportGiới thiệu về OOP trong GoStruct như lớpĐịnh nghĩa phương thức cho structReceiver kiểu con trỏ và kiểu giá trịKhởi tạo structHàm khởi tạoÔn tập: máy tính đơn giản4Interface
Giới thiệu về interfaceTriển khai ngầm địnhInterface như một hợp đồngInterface rỗng (any)Khẳng định kiểuswitch kiểuKết hợp interfaceInterface Stringer và ErrorÔn tập: Máy tính hình học7Tính đóng gói
Trường được xuất và không được xuấtĐóng gói ở cấp packagePhương thức getter và setterẨn thông tin trong GoÔn tập: hồ sơ học sinh10Generics (Go 1.18 trở lên)
Giới thiệu về GenericsTham số kiểuRàng buộc kiểuStruct tổng quátGiải pháp thay thế cho phương thức tổng quátÔn tập: tập hợp tổng quát13Các mẫu thiết kế phần 1
Giới thiệu về mẫu thiết kếMẫu SingletonMẫu FactoryMẫu Abstract FactoryMẫu ObserverMẫu Strategy2Tìm hiểu chuyên sâu về kiểu dữ liệu và struct
Kiểu cơ bản và kiểu tổng hợpĐịnh nghĩa kiểu dữ liệu tùy chỉnhThẻ structStruct ẩn danhStruct lồng nhauGiá trị zero và giá trị mặc địnhÔn tập: sổ liên lạc5Ưu tiên kết hợp hơn kế thừa
Vì sao Go không có kế thừaNhập môn nhúng structTự động nâng phương thứcNhúng nhiều structNhúng và kết tậpChe khuất phương thức được nhúngÔn tập: hệ phân cấp nhân viên8Xử lý lỗi và lập trình hướng đối tượng
Giao diện errorCác kiểu lỗi tùy chỉnhBọc lỗi với fmt.ErrorfLỗi sentinelerrors.Is() và errors.As()Panic, defer và recoverÔn tập: trình phân tích tệp3Con trỏ và bộ nhớ
Cơ bản về con trỏ trong GoCon trỏ đến structTruyền theo giá trị và tham chiếuHàm new()Thu gom rác trong GoÔn tập: xây dựng danh sách liên kết6Đa hình trong Go
Đa hình qua interfaceĐịnh kiểu vịt trong GoQuy tắc thỏa mãn interfaceCác tập hợp đa hìnhTiêm phụ thuộcÔn tập: bộ xử lý thanh toán9Lập trình đồng thời và lập trình hướng đối tượng
Cơ bản về goroutineChannel và giao tiếpChannel có bộ đệm và không có bộ đệmCâu lệnh selectsync.Mutex và sync.RWMutexsync.WaitGroupThiết kế struct an toàn luồngÔn tập: worker poolTự luyện tập: Trình biên dịch Go online