在Golang中如何将interface{}转换为对象?

9
type Human struct {
     Name string
}

func (t *Human) GetInfo() {
    fmt.Println(t.Name)
}

func main() {
    var p1 interface{}
    p1 = Human{Name:"John"}
    //p1.GetInfo() 
}

现在,p1的类型是interface{},但我想获取一个Human对象。

怎么做呢?我可以调用p1.GetInfo()。

2个回答

13

您可以使用类型断言来解包存储在接口变量中的值。根据您的示例,p1.(Human)会从变量中提取一个Human值,或者如果变量保存了不同的类型,则会引发恐慌。

但是,如果您的目的是在接口变量中调用方法,那么您可能不想使用普通的interface{}变量。相反,声明您想要用于接口类型的方法。例如:

type GetInfoer interface {
    GetInfo()
}

func main() {
    var p1 GetInfoer
    p1 = &Human{Name:"John"}
    p1.GetInfo()
}

然后Go会确保你只能使用GetInfo方法将值分配给p1,并确保方法调用调用储存在变量中的类型相应的方法。不再需要使用类型断言,代码将适用于实现接口的任何值。


5

您可以在行内执行类型断言:

p1.(*Human).GetAll()

该链接展示了一个例子。

或者,您可以创建一个新变量来保存 Human 类型。


接收器是指针,请参见[http://play.golang.org/p/j6HhHPohBp]。 - emitle
谢谢,我遇到了另一个问题,怎么办?http://play.golang.org/p/WHBMTPvEAF - emitle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接