golang中的条件变量声明?

golang中的条件变量声明?,go,Go,在Golang中可以这样声明条件变量类型吗 if isAdmin { var result NormalResult } else { var result AdminResult } // do something to &result doSomething(&result) func doSomething(interface{}) { // something } 上述方法不起作用,但其思想是normalResult和adminResults是非常相似的

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

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

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

func doSomething(interface{}) {
  // something
}
上述方法不起作用,但其思想是normalResult和adminResults是非常相似的结构,我该如何做呢


谢谢大家!

根据相似性的不同,您可能会有不同的选择

使用嵌入式结构

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

type NormalResult struct {
    Name  string
    Value int
}
type AdminResult struct {
    *NormalResult
    UserId int64
}
如果AdminResult共享相同的属性,但只添加了几个属性(如UserId),则可以选择将NormalResult嵌入AdminResult,如下所示:

type NormalResult struct {
    Name  string
    Value int
}
type AdminResult struct {
    *NormalResult
    UserId int64
}
然后,您还可以为
NormalResult
声明方法,该方法也将升级为AdminResult:

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

而且,不可能像您建议的那样在Go中使用条件类型。变量只能是一种类型,可以是
NormalResult
AdminResult
interface{}

否,而不是以这种方式。Go是静态类型的,需要在编译时知道类型信息

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

(您还必须在if块之外声明
结果
,因为Go是块范围)


这取决于结果类型的外观。你能举个例子吗?这似乎没有道理。你能举一个真实的例子吗?看起来像是代码的味道:试着思考你的问题以及如何更干净地设计解决方案;您当前的方法很容易导致难以阅读和/或容易出错的代码。将
doSomething
移动到结构的实现中是一个好主意。另一个选择是使用接口来抽象结果类型,但我更喜欢这个。还有,谁投票否决了这一点,没有任何评论?是的,首先我考虑使用接口抽象,但使用嵌入,您只需为
NormalResult
实现接口,两个结构都将实现它。所以这仍然是一个选项。就我个人而言,我会使用@ANisus建议的版本,因为您不需要解包接口和执行类型断言等等。@nemo,我也会这样做,但如果OP确实出于某种原因需要使用distinct type,这将是一种方法。