【问题标题】:Why the & operator on struct doesn't return a digital address?为什么结构上的 & 运算符不返回数字地址?
【发布时间】:2016-11-21 18:15:14
【问题描述】:

我刚开始学习 golang。

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

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

  • 对于结构,它返回其他内容。

代码:

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

【问题讨论】:

    标签: go


    【解决方案1】:

    一元运算符&amp; 对于内置类型和结构的行为相同,用于获取变量的内存地址。在这种情况下,我们会看到&amp;{Sam 55},因为默认情况下 Go 总是检查 fmt.Println() 中的参数是结构体还是指向结构体的指针,在这种情况下会尝试打印结构体的每个字段以进行调试,但是如果你想看到一个指针,你可以使用 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

    【讨论】:

    • 即它是 fmt.Println() 对于指向字符串的指针和指向结构的指针的行为不同。
    • 即fmt.Println 将尝试调用 String() 方法,并且每种类型都有一个默认的字符串表示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2023-01-25
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    相关资源
    最近更新 更多