我将一些Individual
对象存储在切片中。在将其附加到切片之前,我先打印Individual
对象的名称。
将其存储在切片中之后,我将其检索为指针,并希望将名称更改为"Peter"
,但是更改仍然有效,因为它仍然可以打印"Steve"
。为什么?
type Individual interface {
GetName() *string
SetName(name string)
}
type Person struct {
name string
}
// Implement functions of the Individual interface
func (p Person) GetName() *string {
return &p.name
}
func (p Person) SetName(newName string) {
name := p.GetName();
*name = newName
}
var individuals []Individual
func main() {
person := Person{name: "Steve"}
fmt.Println(person)
individuals = append(individuals, person) // append Person to slice
p1 := individuals[0] // Retrieve the only Person from slice
p1.SetName("Peter") // Change name
fmt.Println(p1) // Should print "Peter", but prints "Steve"
fmt.Println(person) // Should print "Peter", but prints "Steve"
}
每当方法想要修改接收者时, 它都必须是指向该值的指针 ;该方法必须具有指针接收器。
如果方法具有非指针接收者,则在调用该方法时将创建并传递一个副本。从那时起,无论您对接收器做什么,都只能修改副本,而不能修改原始副本。
因此,在您的示例中:
func (p Person) SetName(newName string) {
name := p.GetName();
*name = newName
}
当SetName()
被调用时,一份拷贝的Person
。在内部,SetName()
您可以获取要修改name
的 副本 字段的地址。
(实际上,是该 副本的副本 ,稍后会详细介绍…)
解决方案:使用指针接收器:
func (p *Person) SetName(newName string) {
name := p.GetName();
*name = newName
}
从这一点开始,仅*Person
实现Individual
,因此在添加时使用指针:
individuals = append(individuals, &person)
这很棘手,因为在此之后它将不再起作用。这是为什么?
这是因为Person.GetName()
仍然具有非指针接收器:
func (p Person) GetName() *string {
return &p.name
}
因此,当GetName()
从中调用时SetName()
,将再次创建一个副本,GetName()
并将返回name
该 副本
字段的地址,并且SetName()
仅修改为call创建的副本GetName()
。
因此,要使所有工作正常进行,还必须将指针接收器用于GetName()
:
func (p *Person) GetName() *string {
return &p.name
}
现在它可以工作了,输出(在Go Playground上尝试):
{Steve}
&{Peter}
{Peter}
但要知道,最简单和推荐的方法很简单:
func (p *Person) SetName(newName string) {
p.name = newName
}
这就是全部。
本文向大家介绍解析C++中指向对象的指针使用,包括了解析C++中指向对象的指针使用的使用技巧和注意事项,需要的朋友参考一下 C++指向对象的常指针 将指针变量声明为const型,这样指针值始终保持为其初值,不能改变。 如: 定义指向对象的常指针的一般形式为: 也可以在定义指针变量时使之初始化,如将上面第2, 3行合并为: 请注意,指向对象的常指针变量的值不能改变,即始终指向同一个对象,但可以改变其
查看如下程序:nexter是一个接口类型,并且定义了一个next()方法读取下一字节。函数nextFew将nexter接口作为参数并读取接下来的num个字节,并返回一个切片:这是正确做法。但是nextFew2使用一个指向nexter接口类型的指针作为参数传递给函数:当使用next()函数时,系统会给出一个编译错误:*n.next undefined (type nexter has no fiel
问题内容: 我有一个包含10个元素的div,这些元素将被逐个更新,延迟时间为2秒。下面是相同的代码 但是,当我运行它时,所有元素都会一起更新。该程序只是添加一个延迟添加一个开始,并且所有元素都一起更新(被标记)。如何制作代码来逐一标记元素? 问题答案: 您正在打破React的两个基本规则: 不要直接改变状态 如果根据现有状态更新状态,请使用回调形式,因为状态更新可能是异步的(无论如何,在您的示例中
假设有一个结构 我得到一个指向该结构的成员的指针,比如作为某个函数的参数: 如何获取指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,也就是说,我想要标准定义的行为,而不是未定义或实现定义的行为。 附带说明:我知道这规避了类型安全。
我有我的问题的简单例子。有两个学生和三个科目。起初,学生1拥有所有科目,学生2没有科目。关系是一个学生和多个学科的关系。 我正在尝试使用jpa hibernate将subject1从学生1交换到学生2。在数据库中出现事务提交更改后:主题表的外键student_id发生了更改,但在java中,即使我从数据库加载学生1,对象仍然具有subject1。 主要代码: 提交后主题表如下所示。它显示id为1的
13.1.2.获取指南针的更新 表示传感器服务(Sensor Service)的类是SensorManager,接下来就是跟它打交道了。在Activity中实现一个SensorEventListener,将它注册到SensorManager中即可订阅特定传感器的更新。为了省电,我们将传感器操作安排在onResume()与onPause()之间。然后实现侦听器(Listener),在Activity