我刚开始学习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
?
答案 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
打印字段名称和值