初始化嵌入式结构时的指针差异

时间:2014-08-10 18:13:37

标签: pointers go composition embedding

我正在使用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()
}

为什么这些地址不一样?我该如何解决这个问题?

1 个答案:

答案 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)

}

playground

//修改

r := strings.NewReader("hello")

r是一个包含strings.Reader指针的变量,&r是指针指向strings.Reader的变量的地址。

fmt.Printf("document: %#+v\n\n", &b.reader)

&b.reader是变量b.reader的地址,它保留了之前strings.Reader的指针。

相关问题