我正在使用struct embedding,并且对嵌入式结构保持相同的引用存在问题。
试用Go Playground,看看*strings.Reader
有两个不同的指针地址。
package main
import (
"fmt"
"strings"
)
type Base struct {
reader *strings.Reader
}
func NewBase() *Base {
r := strings.NewReader("hello")
fmt.Printf("document: %#+v\n\n", &r)
return &Base{r}
}
func (b *Base) Check() {
fmt.Printf("document: %#+v\n\n", &b.reader)
}
type Concrete struct {
*Base
}
func NewConcrete() *Concrete {
return &Concrete{NewBase()}
}
func main() {
c := NewConcrete()
c.Check()
}
为什么这些地址不一样?我该如何解决这个问题?
答案 0 :(得分:3)
您正在检查指针的地址,而不是指针本身。
func NewBase() *Base {
r := strings.NewReader("hello")
fmt.Printf("document: %#p\n\n", r)
return &Base{r}
}
func (b *Base) Check() {
fmt.Printf("document: %#p\n\n", b.reader)
}
//修改
r := strings.NewReader("hello")
r
是一个包含strings.Reader
指针的变量,&r
是指针指向strings.Reader
的变量的地址。
fmt.Printf("document: %#+v\n\n", &b.reader)
&b.reader
是变量b.reader
的地址,它保留了之前strings.Reader
的指针。