我有一个简单的代码:

type Namer interface {
    PrintName()
}

type P struct {
    Name string
}

func (p *P) PrintName() {
    fmt.Printf("%s\n", p.Name)
}

func main() {
    p := P{Name: "Name"}

    var namers []Namer
    namers = append(namers, &p)
    fmt.Println(reflect.TypeOf(namers[0]))

    on := &namers[0]
    fmt.Println(reflect.TypeOf(on))
    (*on).PrintName()
    (**on).Name = "EEEE"
    (*on).PrintName()
}

和一堆问题:)
  • 为什么我不能写:append(namers,p)? &p是指向P的指针,数组命名器不是
  • 指针数组
  • 为什么TypeOf(namers [0])是* P而TypeOf(on)是* Namer?这没有任何意义,TypeOf(&(* P))应该是** P
  • 为什么最后一行打印:“名称”而不是“EEE”?

  • 感谢帮助!

    最佳答案

  • P不实现接口Namer,仅实现* P,因为在* P上定义了PrintName()。
  • 据我了解,TypeOf(namers [0])为* P,因为您正在检查实际的slice元素本身,并且TypeOf可以在界面内部看到。使用TypeOf(&namers [0]),您只需获取第一个元素的地址并检查其类型(当然,* Namer,因为Namers是Namer接口元素的一部分),而无需实际查看“内部”元素本身。
  • 最后一行不显示任何内容,因为(** on).Name是不允许的。将其更改为(* on)。(* P).Name =“EEEE”并按预期工作。
  • 10-01 17:35