我在下面添加了两个结构,我试图创建一个通用函数,在其中将结构名称作为字符串传递。我最近开始研究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 = "dev@gmail.com"
fmt.Println(temp) // {"", "", "", 0, 0}
}
我将函数称为Testing("UserDetail")
我以结构名称作为字符串并在函数定义中调用该函数,基于结构名称,我通过转换空接口来创建所需的结构实例。创建空的struct实例后,如果我尝试向其添加任何字段值,并尝试打印变量,则会给我一个错误,提示:
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)
如果我不更新变量字段,它将使用默认值打印变量。我的主要动机是根据条件将接口转换为结构,并在整个函数中使用转换后的变量。
答案 0 :(得分:0)
在最终能够修改其属性之前,您需要从接口获取基础的具体值。
在golang中,有一个名为type assertions的东西,它用于从接口变量中获取具体值。
类型断言提供对接口值的基础具体值的访问。
用法示例:
tempConcreteValue := temp.(UserDetail)
tempConcreteValue.FirstName = "Dev"
tempConcreteValue.Email = "dev@gmail.com"
fmt.Println(tempConcreteValue) // {"", "", "", 0, 0}
如上面的代码所示,.(UserDetail)
末尾的temp
将以temp
类型返回接口UserDetail
的具体值。>
答案 1 :(得分:0)
Go永远不会那样工作。因为go是静态类型的。因此,在编译时,它无法理解if ($emc > 0 || strlen($contact)!=10 || !is_numeric($contact)){
$emailerror="E-mail id is already registred";
$contacterror="Wrong Number";
}
,因为temp只是一个接口{}(可以保存任何值)。
但是许多功能使它“看起来”是(至少在某种程度上)是动态键入的。您可以通过@xpare选择答案,也可以为每个结构声明一个单独的变量。
答案 2 :(得分:0)
您想要将字段值设置为您分配给UserDetail
的{{1}}结构。但是该字段属于interface{} temp
结构,而不属于UserDetail
。这就是为什么首先需要从temp interface{}
获取UserDetail
结构并设置期望的字段值的原因。还可以使用指针符号来确保将值设置为原始的interface{}
结构。然后打印UserDetail
。 Go将打印原始值。所以这样使用:
temp interface{}
修改
由于您的动机是func Testing(model string) {
var temp interface{}
if model == "UserDetail" {
fmt.Println("Enterr...")
temp = &UserDetail{}
}
u := temp.(*UserDetail)
u.FirstName = "Dev"
u.Email = "dev@gmail.com"
//temp = u
fmt.Println(temp) // {"", "", "", 0, 0}
}
,请使用以下方法:
The objective is that users would define their own structs and call a function similar to the Testing and I would get the data from the correct table in a database and then return the interface filled with data
答案 3 :(得分:0)
如果您想执行特定于类型的代码,我可以将Testing函数的参数更改为(model interface {}),然后创建如下的switch语句:
switch model.(type) {
case UserDetail:
<code>
case Matter:
<code>
}