请教个问题,代码如下:
```go
package main
import "fmt"
func main() {
a := &A{}
a.update()
fmt.Println(a) //这里为什么打印出来是空对象
}
type A struct {
b string
}
func (a *A) update() {
t := []A{A{b: "1"}, A{b: "2"}, A{b: "3"}} //代表随便三个非空对象
a = &t[0]
fmt.Println(a) //打印出来是非空对象
return
}
```
执行结果
```go
&{1} //打印出来是非空对象
&{} //这里为什么打印出来是空对象
```
```
package main
import "fmt"
func main() {
a := &A{}
fmt.Printf("%p\n", a)
a.update()
fmt.Printf("%p\n", a)
}
type A struct {
b string
}
func (a *A) update() {
t := []A{A{b: "1"}, A{b: "2"}, A{b: "3"}}
fmt.Printf("%p\n", a)
a= &t[0]
fmt.Printf("%p\n", a)
return
}
```
用上面打印a所在地址可以看出来,第3行的地址变了,第4行又变回来了
当`a= &t[0]`后`a`的已经不是main里的a了,而是一个局部的a
你可以把`a= &t[0]`看成`b:= &t[0]`
之所以`a= &t[0]`不能写成`a:= &t[0]`,我想应该是`func (a *A) update()`里已经声明过a了的关系吧
#10
更多评论