```go
type Person struct{
name string
age int
}
func main(){
p1:=“123”
p2:=&p1
fmt.Println(p2)//打印出0xc21001e140
p3:=&Person{“ZhangSan”,18}
fmt.Println(p3)//打印出&{ZhangSan 18}
}
```
**为什么这里结构体指针打印出的是`&{}`的形式,而不是像`*int`、`*string`这些类型一样,打印出的是内存地址**
```go
type Person struct{
name string
age int
}
func setStruct (v *Person){
v.name = “LiSi”
v.age = 20
}
func main(){
p:=Person{“ZhangSan”,18}
setStruct(&p)
fmt.Println(p)//打印出{LiSi 20}
}
```
**函数setStruct参数是一个结构体指针,为什么在函数中赋值时,不是用`*v.name`进行赋值而是直接用`v.name`**
```go
type Person strcut(){
name string
age int
}
func (p *Person) changeName(){
p.name = “Lisi”
}
func main(){
p1:=Person{“ZhangSan”,18}
p1.changeName()
fmt.Println(p1)//打印出{Lisi 18}
}
```
**方法`changeName`中的接收器(`p *Person`)是一个结构体指针,为什么在调用这个方法时,不用`&p1.changeName()`就可以调用方法**
看一下println源码你就知道了,里面做了很多判断,如果是Map,Struct,Interface, Array, Slice,Ptr,并且没有定义String方法时,他就会按照默认的方式打印,像那个int,你穿进去的是个指针,他内部就会去掉int类型的获取地址的方法然后打印
#6
更多评论
Go语言指针
在Go语言中,直接砍掉了 C 语言指针最复杂的指针运算部分,只留下了获取指针(&运算符)和获取对象(*运算符)的运算,用法和C语言很类似。但不同的是,Go语言中没有->操作符来调用指针所属的成员,而与一般对象一样,都是使用.来调用。
Go 语言中一个指针被定义后没有分配到任何变量时,它的值为nil。
Go 语言自带指针隐式解引用 :对于一些复杂类型的指针, 如果要访问成员变量时候需要写成类似*p.field的形式时,只需要p.field即可访问相应的成员。
https://studygolang.com/articles/17040
你这三个问题其实是一个问题 指针隐式解引用
#2