目前编程网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《无法根据 Golang 中的条件将接口转换为结构》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~
问题内容我这里有两个结构体,如下所示,我正在尝试创建一个通用函数,在其中将结构体名称作为字符串传递。我最近开始从事 go 工作。
type userdetail struct {
firstname string
lastname string
email string
user int
reportsto int
}
type matter struct {
id int
name string
active bool
createdat time.time
updatedat time.time
userid int
}
下面添加了函数片段
func testing(model string) {
var temp interface{}
if model == "userdetail" {
fmt.println("enterr...")
temp = userdetail{}
}
temp.firstname = "dev"
temp.email = "[email protected]"
fmt.println(temp) // {"", "", "", 0, 0}
}
我将该函数调用为 testing("userdetail")
我使用结构名称作为字符串调用函数,并在函数定义中,根据结构名称,我通过转换空接口来创建所需的结构实例。创建空结构实例后,如果我尝试向其中添加任何字段值,并尝试打印变量,则会出现错误:
prog.go:33:6: temp.FirstName undefined (type I is interface with no methods)
prog.go:34:6: temp.Email undefined (type I is interface with no methods)
如果我不更新变量字段,它将使用默认值打印变量。我的主要动机是根据条件将接口转换为结构体,并在整个函数中使用转换后的变量。
解决方案
您需要从接口获取底层的具体值,然后才能最终修改其属性。
在golang中,有一个叫做type assertions的东西,它用于从接口变量中获取具体值。
使用示例:
tempConcreteValue := temp.(UserDetail)
tempConcreteValue.FirstName = "Dev"
tempConcreteValue.Email = "[email protected]"
fmt.Println(tempConcreteValue) // {"", "", "", 0, 0}
从上面的代码可以看出,temp
末尾的.(userdetail)
将返回接口temp
的具体值,类型为userdetail
。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《无法根据 Golang 中的条件将接口转换为结构》文章吧,也可关注编程网公众号了解相关技术文章。