无法根据Golang中的条件隐藏接口以构建结构

时间:2018-11-22 08:35:27

标签: go struct interface

我在下面添加了两个结构,我试图创建一个通用函数,在其中将结构名称作为字符串传递。我最近开始研究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)

如果我不更新变量字段,它将使用默认值打印变量。我的主要动机是根据条件将接口转换为结构,并在整个函数中使用转换后的变量。

4 个答案:

答案 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>
}