Menu
CoddyTech

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.

challenge icon

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à:

  1. Định nghĩa cấu trúc Sensor với hai trường: ID (chuỗi) và Temperature (float64)
  2. Tạo phương thức có tên displayReading với bộ nhận giá trị để in thông tin cảm biến theo định dạng: "Sensor [ID]: [temperature]°C"
  3. Tạo phương thức có tên adjustTemperature vớ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"
  4. Phân tích các đầu vào để tạo một đối tượng Sensor
  5. Gọi phương thức displayReading để hiển thị nhiệt độ ban đầu
  6. Gọi phương thức adjustTemperature với giá trị điều chỉnh
  7. 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
    
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Go online