类型、接口和指针

我有一个简单的代码:


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”?

感谢帮助!


喵喵时光机
浏览 182回答 3
3回答

慕慕森

断言*on类型为*P。例如,package mainimport (    "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()}输出:*主.P*main.Namer姓名电子电气设备

慕桂英4014372

我想 - 请记住,我并不真正精通 GO - 您所有问题的主要原因与您PrintName以接收者(实现者)对象是指针的方式实现的事实有关。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go