值接收者
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 7 课,共 68 课。
使用值接收者定义方法时,该方法操作的是结构体实例的副本,而不是原实例。这意味着,在方法内部对接收者所做的任何更改都不会影响原始结构体变量。
type Counter struct {
Value int
}
func (c Counter) increment() {
c.Value++ // 这修改的是副本,不是原对象。
}在这个示例中,increment 方法使用值接收者 (c Counter)。当你在 Counter 实例上调用这个方法时,Go 会创建一份结构体的副本,并将它传递给该方法。在方法内部对 c.Value 的任何修改都只会影响这份副本。
当你的方法只需要读取结构体中的数据而不修改它时,值接收者很有用。使用值接收者是安全的,因为它能确保原始数据保持不变,让代码更容易预测,并防止意外的副作用。
挑战
简单在这个挑战中,你将通过创建一个简单的温度监测系统,练习使用值接收者。你将创建一个 Sensor 结构体,并定义一些方法,展示值接收者如何与结构体的副本配合使用。
你将收到 3 个输入:
- 表示传感器 ID 的字符串(例如,
"TEMP001") - 表示当前温度读数的字符串(例如,
"23.5") - 表示温度调整值的字符串(例如,
"2.0")
你的任务是:
- 定义一个包含两个字段的
Sensor结构体:ID(字符串)和Temperature(float64) - 创建一个名为
displayReading的方法,并使用值接收者,按以下格式输出传感器信息:"Sensor [ID]: [temperature]°C" - 创建一个名为
adjustTemperature的方法,并使用值接收者,将调整值加到温度上,然后输出:"Adjusted reading: [new_temperature]°C" - 解析输入,创建一个
Sensor实例 - 调用
displayReading方法,显示原始温度 - 使用调整值调用
adjustTemperature方法 - 再次调用
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 实例并调用所需的方法
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器