我正在尝试结构嵌入,但在保持对嵌入结构的相同引用时遇到问题。
试试 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()
}
为什么这些地址不一样?我该如何解决这个问题?
最佳答案
您正在检查指针的地址,而不是指针本身。
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
的指针。
关于pointers - 初始化嵌入结构时的指针差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231592/