为什么& struct上的operator不返回数字地址?

时间:2016-11-20 09:19:25

标签: go

我刚开始学习golang。

我发现&运算符对简单类型和结构的行为不同。

  • 对于简单类型,&会返回一个地址。

  • 对于struct,它会返回其他内容。

代码:

package main

import "fmt"

type person struct {
    name string
    age  int
}

func main() {
    s1 := "abc"
    fmt.Println("s1 address =", &s1)

    s2 := person{"Sam", 55}
    fmt.Println("s2 address = ", &s2)

}

输出:

[ `hello` | done: 79.0079ms ]
    s1 address = 0xc04203c1e0
    s2 address =  &{Sam 55}   <======== What's this? And why not some address like above?

此外,此设计是have-to还是happen-to

1 个答案:

答案 0 :(得分:10)

单元运算符&对于内置类型和结构的行为相同,它用于获取var的内存地址。在这种情况下,我们将看到&{Sam 55},因为如果fmt.Println()中的参数是结构或指向struct的指针,Go总是默认检查,在这种情况下,将尝试打印结构的每个字段以进行调试目的,但如果你想看到一个指针,你可以使用fmt.Printf()和%p,如下所示:

func main() {
    s1 := "abc"
    fmt.Println("s1 address =", &s1)

    s2 := person{"Sam", 55}

    fmt.Println("s2 as pointer =", &s2)

    fmt.Printf("s2 address = %p value with fields %+v", &s2, s2)
}

奖励:您可以使用%+v打印字段名称和值

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