是否可以在Golang中执行这样的条件变量类型声明?
if isAdmin {
var result NormalResult
} else {
var result AdminResult
}
// do something to &result
doSomething(&result)
func doSomething(interface{}) {
// something
}
上述方法不起作用,但是想法是normalResult和adminResults是非常相似的结构,我将如何做到这一点?
谢谢!
答案 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中不可能有条件类型。变量只能是一种类型,NormalResult
,AdminResult
或interface{}
答案 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)
}