登录
首页 >  Golang >  Go问答

指针的操作

来源:stackoverflow

时间:2024-03-18 16:36:29 480浏览 收藏

指针在 Go 中扮演着至关重要的角色,它允许我们直接操作变量的内存地址。然而,指针的行为有时可能会令人困惑。在本文中,我们将探讨一个常见的误解,即通过引用传递变量时,如何确保每个变量具有唯一的地址。 通过引用传递变量意味着我们传递的是变量的内存地址,而不是变量本身。这可以提高效率,因为我们不必在每次调用函数时复制整个变量。然而,如果我们不谨慎,我们可能会无意中创建对同一内存地址的多个引用。

问题内容

我试图理解指针的行为,但我对这里可以观察到的内容感到困惑:

package main

import (
    "fmt"
)

type person struct {
    name string
}
type personspecial struct {
    name *string
}

func mappersontonewperson(p *person) *personspecial {
    fmt.printf("inside special person mapper: %+v\n", &p)
    dummy := &personspecial{
        name: &p.name,
    }
    fmt.printf("inside special person mapper lower: %+v\n", dummy)
    return dummy
}
func createperson(name string) person{
    return person{name: name};
}
func main() {
        persons :=[]person{createperson("one"), createperson("two")}
    persons2 :=[]*personspecial{}

    for _, person := range persons {
        dummy := mappersontonewperson(&person)
        fmt.printf("inside first loop: %+v\n", dummy)
        persons2 = append(persons2, dummy)

    }
    for _, person1 := range persons2 {
        fmt.printf("%+v\n", *person1.name)
    }
}
Inside Special Person Mapper: 0x1040c130
Inside Special Person Mapper Lower: &{name:0x1040c128}
Inside First Loop: &{name:0x1040c128}
Inside Special Person Mapper: 0x1040c150
Inside Special Person Mapper Lower: &{name:0x1040c128}
Inside First Loop: &{name:0x1040c128}
Two
Two

https://play.golang.org/p/jnsxooqibty

尽管我通过引用传递他们,但为什么我得到的两个人的地址相同?我在这里做错了什么吗?


解决方案


问题在于对此声明的误解:

“person”是 Person 类型的变量。在此“for”语句中,persons[0] 的值被复制到“person”变量中。实际上,下一个语句“dummy := MapPersonToNewPerson(&person)”采用同一变量的指针并将其两次添加到persons2中。

当第二次执行for循环时,“person”变量的内容被更新为persons[1]。

在最后一个“for”循环中,同一指针的内容被打印两次。 如果您在第二个 for 循环中打印 person1.name 的指针值,您将看到两个元素的指针值相同。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>