Ôn tập: hành vi của struct
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 11 trên 68.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập cách triển khai cả bộ nhận giá trị lẫn bộ nhận con trỏ bằng cách tạo một hệ thống quản lý hình chữ nhật đơn giản. Bạn sẽ tạo một struct Rectangle và định nghĩa hai kiểu phương thức khác nhau để minh họa khi nào nên dùng từng kiểu bộ nhận.
Bạn sẽ nhận được ba đầu vào:
- Một chuỗi biểu thị chiều rộng của hình chữ nhật (ví dụ:
"5.0") - Một chuỗi biểu thị chiều cao của hình chữ nhật (ví dụ:
"3.0") - Một chuỗi biểu thị hệ số tỉ lệ (ví dụ:
"2.0")
Nhiệm vụ của bạn là:
- Định nghĩa một struct
Rectanglecó hai trường:Width(float64) vàHeight(float64) - Tạo một phương thức tên là
areavới bộ nhận giá trị, tính và trả về diện tích hình chữ nhật (chiều rộng × chiều cao) - Tạo một phương thức tên là
scalevới bộ nhận con trỏ, nhân cả chiều rộng và chiều cao với hệ số tỉ lệ đã cho - Phân tích cú pháp các đầu vào để tạo một instance
Rectangle - In diện tích ban đầu theo định dạng:
"Initial area: [area]" - Gọi phương thức
scalevới hệ số tỉ lệ - In diện tích sau khi thay đổi tỉ lệ theo định dạng:
"Scaled area: [area]"
Hiển thị diện tích dưới dạng số nguyên nếu giá trị là số nguyên (ví dụ: 15 thay vì 15.0), nhưng hiển thị phần thập phân khi cần (ví dụ: 15.5). Thử thách này minh họa nguyên tắc cốt lõi: dùng bộ nhận giá trị cho các phương thức chỉ đọc dữ liệu, chẳng hạn như tính diện tích, và dùng bộ nhận con trỏ cho các phương thức thay đổi struct ban đầu, chẳng hạn như thay đổi tỉ lệ kích thước.
Tự làm thử
package main
import (
"fmt"
"strconv"
)
// TODO: Định nghĩa struct Rectangle tại đây
// TODO: Triển khai phương thức area với bộ nhận giá trị tại đây
// TODO: Triển khai phương thức scale với bộ nhận con trỏ tại đây
func main() {
// Đọc đầu vào
var widthStr string
var heightStr string
var scaleStr string
fmt.Scanln(&widthStr)
fmt.Scanln(&heightStr)
fmt.Scanln(&scaleStr)
// Chuyển đầu vào sang float64
width, _ := strconv.ParseFloat(widthStr, 64)
height, _ := strconv.ParseFloat(heightStr, 64)
scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
// TODO: Tạo instance Rectangle và triển khai lời giải bên dưới
// In ra diện tích ban đầu
// fmt.Printf("Initial area: %.0f\n", initialArea) // Dùng định dạng này cho đầu ra
// Thay đổi kích thước hình chữ nhật
// In ra diện tích sau khi thay đổi kích thước
// fmt.Printf("Scaled area: %.0f\n", scaledArea) // Dùng định dạng này cho đầu ra
}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