how to convert interface{} to object in golang?

huangapple go评论82阅读模式
英文:

how to convert interface{} to object in golang?

问题

现在,p1的类型是interface{},但我想要获取一个Human对象。该怎么办?我可以调用p1.GetInfo()吗?

你可以使用类型断言来获取p1中的Human对象。类型断言可以将接口类型转换为具体的类型。在这种情况下,你可以使用如下代码来获取Human对象并调用GetInfo()方法:

if human, ok := p1.(*Human); ok {
    human.GetInfo()
}

这里的*Human表示将p1转换为指向Human类型的指针。如果类型断言成功,ok的值将为true,你就可以通过human变量来调用GetInfo()方法了。如果类型断言失败,ok的值将为false,你可以根据需要进行错误处理。

英文:
type Human struct {
     Name string
}

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

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

now,p1's typs is interface{}, but i want get a Human object.

How to do? i can call p1.GetInfo()

答案1

得分: 13

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

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

type GetInfoer interface {
    GetInfo()
}

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

Go语言将确保你只将具有GetInfo方法的值赋给p1,并确保方法调用调用与存储在变量中的类型相适应的方法。不再需要使用类型断言,代码将适用于实现该接口的任何值。

英文:

You can use a type assertion to unwrap the value stored in an interface variable. From your example, p1.(Human) would extract a Human value from the variable, or panic if the variable held a different type.

But if your aim is to call methods on whatever is held in the interface variable, you probably don't want to use a plain interface{} variable. Instead, declare the methods you want for the interface type. For instance:

type GetInfoer interface {
    GetInfo()
}

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

Go will then make sure you only assign a value with a GetInfo method to p1, and make sure that the method call invokes the method appropriate to the type stored in the variable. There is no longer a need to use a type assertion, and the code will work with any value implementing the interface.

答案2

得分: 5

你可以在行内进行类型断言:

p1.(*Human).GetAll()

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

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

英文:

You can do a type assertion inline:

p1.(*Human).GetAll()

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

Or you can create a new variable to hold a Human type.

huangapple
  • 本文由 发表于 2013年12月31日 13:50:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/20852454.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定