为了账号安全,请及时绑定邮箱和手机立即绑定

类型、接口和指针

类型、接口和指针

Go
喵喵时光机 2021-10-04 16:51:16
我有一个简单的代码: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”?感谢帮助!
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

断言*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()

}

输出:


*主.P

*main.Namer

姓名

电子电气设备


查看完整回答
反对 回复 2021-10-04
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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


查看完整回答
反对 回复 2021-10-04
  • 3 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信