如何在golang中将interface {}转换为object?

emi*_*tle 7 go

type Human struct {
     Name string
}

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

func main() {
    var p1 interface{}
    p1 = Human{Name:"John"}
    //p1.GetInfo() 
}
Run Code Online (Sandbox Code Playgroud)

现在,p1的典型是接口{},但我想得到一个Human对象.

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

Jam*_*dge 12

您可以使用类型断言来解包存储在接口变量中的值.从您的示例中,p1.(Human)将从Human变量中提取值,或者如果变量保持不同的类型则会发生混乱.

但是如果你的目标是调用接口变量中保存的方法,你可能不想使用普通interface{}变量.而是声明您想要的接口类型的方法.例如:

type GetInfoer interface {
    GetInfo()
}

func main() {
    var p1 GetInfoer
    p1 = &Human{Name:"John"}
    p1.GetInfo()
}
Run Code Online (Sandbox Code Playgroud)

然后,Go将确保只为GetInfo方法赋值p1,并确保方法调用调用适合存储在变量中的类型的方法.不再需要使用类型断言,代码将与实现接口的任何值一起使用.


Eve*_*man 6

你可以在内联做一个类型断言:

p1.(*Human).GetAll()
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/ldtVrPnZ79

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