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

标签 pointers go composition 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()
}

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

最佳答案

您正在检查指针的地址,而不是指针本身。

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 的指针。

关于pointers - 初始化嵌入结构时的指针差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231592/

相关文章:

go - 在golang中,如何保护自己的锁不被调用者破坏?

c# - 合成后如何更改 MEF 中的部分合成?

haskell - Haskell 中的函数组合

c++ * 和 & 同时

pointers - 不能分配给 `*x` 因为它是借来的

c - 分配给类型时不兼容的类型 - C

go - 如何使用 golang 运行 dir 命令?

c++ - 提供 optional 参数的现代 C++ 方法

go - 从golang中的xls文件中读取数字类型单元格

java - 关于优先使用组合而不是继承方法,策略模式