我有一个简单的代码:
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()
}
和一堆问题:)
感谢您的帮助!
答案 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)
P没有实现接口Namer,只有* P,因为在* P上定义了PrintName()。
据我所知,TypeOf(namers [0])是* P,因为你正在检查实际的切片元素本身,而TypeOf可以在界面内看到。使用TypeOf(& namers [0]),您只需要获取第一个元素的地址并检查其类型(当然,这是* Namer,因为命名符是Namer接口的一部分)元素),实际上没有看到元素本身的“内部”。
最后一行不打印任何内容,因为(** on).Name是不允许的。将其更改为(* on)。(* P).Name =“EEEE”并按预期工作。