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()。
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()。
您可以使用类型断言来解包存储在接口变量中的值。根据您的示例,p1.(Human)
会从变量中提取一个Human
值,或者如果变量保存了不同的类型,则会引发恐慌。
但是,如果您的目的是在接口变量中调用方法,那么您可能不想使用普通的interface{}
变量。相反,声明您想要用于接口类型的方法。例如:
type GetInfoer interface {
GetInfo()
}
func main() {
var p1 GetInfoer
p1 = &Human{Name:"John"}
p1.GetInfo()
}
然后Go会确保你只能使用GetInfo
方法将值分配给p1
,并确保方法调用调用储存在变量中的类型相应的方法。不再需要使用类型断言,代码将适用于实现接口的任何值。