golang中的条件变量声明?

sam*_*mol 12 go

在Golang中可以像这样进行条件变量类型声明吗?

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

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

func doSomething(interface{}) {
  // something
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

ANi*_*sus 7

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

使用嵌入式结构

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

type NormalResult struct {
    Name  string
    Value int
}
Run Code Online (Sandbox Code Playgroud)

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

type AdminResult struct {
    *NormalResult
    UserId int64
}
Run Code Online (Sandbox Code Playgroud)

然后,您还可以声明NormalResult将被提升为AdminResult的方法:

func (r *NormalResult) doSomething() {
    // Doing something
}
Run Code Online (Sandbox Code Playgroud)

编辑
并且,不,如您所建议的那样,Go中不可能有条件类型.变量只能是一种类型,无论是NormalResult,AdminResult还是interface{}

  • 是的,首先我考虑使用接口抽象,但是使用嵌入只需要为`NormalResult`实现接口,两个结构都将实现它.所以它仍然是一种选择. (2认同)

Jim*_*imB 7

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

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

(你还必须result在if块之外声明,因为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)

}
Run Code Online (Sandbox Code Playgroud)