Menu
CoddyTech

值接收者

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 7 课,共 68 课。

使用值接收者定义方法时,该方法操作的是结构体实例的副本,而不是原实例。这意味着,在方法内部对接收者所做的任何更改都不会影响原始结构体变量。

type Counter struct {
    Value int
}

func (c Counter) increment() {
    c.Value++  // 这修改的是副本,不是原对象。
}

在这个示例中,increment 方法使用值接收者 (c Counter)。当你在 Counter 实例上调用这个方法时,Go 会创建一份结构体的副本,并将它传递给该方法。在方法内部对 c.Value 的任何修改都只会影响这份副本。

当你的方法只需要读取结构体中的数据而不修改它时,值接收者很有用。使用值接收者是安全的,因为它能确保原始数据保持不变,让代码更容易预测,并防止意外的副作用。

challenge icon

挑战

简单

在这个挑战中,你将通过创建一个简单的温度监测系统,练习使用值接收者。你将创建一个 Sensor 结构体,并定义一些方法,展示值接收者如何与结构体的副本配合使用。

你将收到 3 个输入:

  • 表示传感器 ID 的字符串(例如,"TEMP001")
  • 表示当前温度读数的字符串(例如,"23.5")
  • 表示温度调整值的字符串(例如,"2.0")

你的任务是:

  1. 定义一个包含两个字段的 Sensor 结构体:ID(字符串)和 Temperature(float64)
  2. 创建一个名为 displayReading 的方法,并使用值接收者,按以下格式输出传感器信息:"Sensor [ID]: [temperature]°C"
  3. 创建一个名为 adjustTemperature 的方法,并使用值接收者,将调整值加到温度上,然后输出:"Adjusted reading: [new_temperature]°C"
  4. 解析输入,创建一个 Sensor 实例
  5. 调用 displayReading 方法,显示原始温度
  6. 使用调整值调用 adjustTemperature 方法
  7. 再次调用 displayReading 方法,展示原始结构体保持不变

这个挑战将展示,使用值接收者的方法会对结构体的副本进行操作。因此,即使调用了 adjustTemperature 方法,原始结构体中的温度值也会保持不变。温度值应保留 1 位小数。

亲手试试

package main

import (
    "fmt"
    "strconv"
)

// TODO:在这里定义你的 Sensor 结构体

// TODO:在这里定义使用值接收者的 displayReading 方法

// TODO:在这里定义使用值接收者的 adjustTemperature 方法

func main() {
    // 读取输入
    var sensorID string
    var tempStr string
    var adjustStr string
    
    fmt.Scanln(&sensorID)
    fmt.Scanln(&tempStr)
    fmt.Scanln(&adjustStr)
    
    // 解析温度值和调整值
    temperature, _ := strconv.ParseFloat(tempStr, 64)
    adjustment, _ := strconv.ParseFloat(adjustStr, 64)
    
    // TODO:创建一个 Sensor 实例并调用所需的方法
    
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器