类型,接口和指针

时间:2015-05-09 11:10:38

标签: go

我有一个简单的代码:

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()
}

和一堆问题:)

  1. 为什么我不能写:追加(名字,p)? & p是指向P的指针,数组名称不是指针数组
  2. 为什么TypeOf(namers [0])是* P而TypeOf(on)是* Namer?没有意义,TypeOf(&(* P))应该是** P
  3. 为什么最后一行打印:"名称"而不是" EEE"?
  4. 感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

断言*on的类型为*P。例如,

package main

import (
    "fmt"
    "reflect"
)

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).(*P).Name = "EEEE"
    (*on).PrintName()
}

输出:

*main.P
*main.Namer
Name
EEEE

答案 1 :(得分:0)

我想 - 记住我并不是真的精通GO - 所有问题的主要原因都与你以接收者(实施者)对象的方式实现PrintName的事实有关。指针。

答案 2 :(得分:0)

  1. P没有实现接口Namer,只有* P,因为在* P上定义了PrintName()。

  2. 据我所知,TypeOf(namers [0])是* P,因为你正在检查实际的切片元素本身,而TypeOf可以在界面内看到。使用TypeOf(& namers [0]),您只需要获取第一个元素的地址并检查类型(当然,这是* Namer,因为命名符是Namer接口的一部分)元素),实际上没有看到元素本身的“内部”。

  3. 最后一行不打印任何内容,因为(** on).Name是不允许的。将其更改为(* on)。(* P).Name =“EEEE”并按预期工作。