golang中的条件变量声明?

时间:2013-10-09 18:35:34

标签: go

是否可以在Golang中执行这样的条件变量类型声明?

if isAdmin {
  var result NormalResult
} else {
  var result AdminResult
}

// do something to &result
doSomething(&result)

func doSomething(interface{}) {
  // something
}

上述方法不起作用,但是想法是normalResult和adminResults是非常相似的结构,我将如何做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:7)

根据具体的相似性,您可能有不同的选择。

使用嵌入式结构

根据您的结构,您可能可以使用嵌入式结构。假设NormalResult的定义如下:

type NormalResult struct {
    Name  string
    Value int
}

如果AdminResult共享相同的属性但只添加了一些属性(如UserId),您可以选择将NormalResult嵌入到AdminResult中,如下所示:

type AdminResult struct {
    *NormalResult
    UserId int64
}

然后你也可以声明NormalResult的方法,这些方法也将被提升为AdminResult:

func (r *NormalResult) doSomething() {
    // Doing something
}

修改
并且,不,如您所建议的那样,Go中不可能有条件类型。变量只能是一种类型,NormalResultAdminResultinterface{}

答案 1 :(得分:7)

不,不是这样。要进行静态类型化,需要在编译时知道类型信息。

您可以做的是将result声明为AdminResult和NormalResult都满足的某种类型的接口。然后,您可以在运行时使用类型断言来确定它的结果类型。

(你还必须在if块之外声明result,因为Go是块范围的)

type NormalResult struct {
    Value int
}

func (r NormalResult) Result() int {
    return r.Value
}

type AdminResult struct {
    Value int
}

func (r AdminResult) Result() int {
    return r.Value
}

type Resulter interface {
    Result() int
}

func main() {
    isAdmin := true
    var r Resulter

    if isAdmin {
        r = AdminResult{2}
    } else {
        r = NormalResult{1}
    }

    fmt.Println("Hello, playground", r)

}