Receiver giá trị
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 7 trên 68.
Khi bạn định nghĩa một phương thức với bộ nhận giá trị, phương thức sẽ thao tác trên bản sao của instance struct thay vì bản gốc. Điều này có nghĩa là mọi thay đổi đối với bộ nhận bên trong phương thức sẽ không ảnh hưởng đến biến struct ban đầu.
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // Lệnh này thay đổi bản sao, không thay đổi bản gốc
}Trong ví dụ này, phương thức increment dùng receiver giá trị (c Counter). Khi bạn gọi phương thức này trên một instance Counter, Go tạo một bản sao của struct rồi truyền bản sao đó vào phương thức. Mọi thay đổi đối với c.Value bên trong phương thức chỉ ảnh hưởng đến bản sao này.
Receiver dạng giá trị rất hữu ích khi phương thức của bạn chỉ cần đọc dữ liệu từ struct mà không sửa đổi dữ liệu đó. Bạn có thể dùng chúng một cách an toàn vì chúng đảm bảo dữ liệu gốc không thay đổi, giúp code dễ dự đoán hơn và ngăn các tác dụng phụ ngoài ý muốn.
Thử thách
DễTrong thử thách này, bạn sẽ luyện tập cách làm việc với bộ nhận giá trị bằng cách tạo một hệ thống theo dõi nhiệt độ đơn giản. Bạn sẽ tạo một cấu trúc Sensor và định nghĩa các phương thức minh họa cách bộ nhận giá trị hoạt động với bản sao của cấu trúc.
Bạn sẽ nhận ba đầu vào:
- Một chuỗi biểu thị ID của cảm biến (ví dụ:
"TEMP001") - Một chuỗi biểu thị số đo nhiệt độ hiện tại (ví dụ:
"23.5") - Một chuỗi biểu thị giá trị điều chỉnh nhiệt độ (ví dụ:
"2.0")
Nhiệm vụ của bạn là:
- Định nghĩa cấu trúc
Sensorvới hai trường:ID(chuỗi) vàTemperature(float64) - Tạo phương thức có tên
displayReadingvới bộ nhận giá trị để in thông tin cảm biến theo định dạng:"Sensor [ID]: [temperature]°C" - Tạo phương thức có tên
adjustTemperaturevới bộ nhận giá trị để cộng giá trị điều chỉnh vào nhiệt độ và in:"Adjusted reading: [new_temperature]°C" - Phân tích các đầu vào để tạo một đối tượng
Sensor - Gọi phương thức
displayReadingđể hiển thị nhiệt độ ban đầu - Gọi phương thức
adjustTemperaturevới giá trị điều chỉnh - Gọi lại phương thức
displayReadingđể chứng minh cấu trúc ban đầu không thay đổi
Thử thách này sẽ cho thấy các phương thức có bộ nhận giá trị hoạt động trên bản sao của cấu trúc, vì vậy giá trị nhiệt độ của cấu trúc ban đầu sẽ không thay đổi ngay cả sau khi gọi phương thức adjustTemperature. Các giá trị nhiệt độ cần được hiển thị với độ chính xác một chữ số thập phân.
Tự làm thử
package main
import (
"fmt"
"strconv"
)
// TODO: Định nghĩa struct Sensor tại đây
// TODO: Định nghĩa phương thức displayReading với bộ nhận giá trị tại đây
// TODO: Định nghĩa phương thức adjustTemperature với bộ nhận giá trị tại đây
func main() {
// Đọc dữ liệu đầu vào
var sensorID string
var tempStr string
var adjustStr string
fmt.Scanln(&sensorID)
fmt.Scanln(&tempStr)
fmt.Scanln(&adjustStr)
// Phân tích giá trị nhiệt độ và giá trị điều chỉnh
temperature, _ := strconv.ParseFloat(tempStr, 64)
adjustment, _ := strconv.ParseFloat(adjustStr, 64)
// TODO: Tạo một instance Sensor và gọi các phương thức cần thiết
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiế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