在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是非常相似的结构,我将如何做到这一点?
谢谢!
根据具体的相似性,您可能有不同的选择.
使用嵌入式结构
根据您的结构,您可以使用嵌入式结构.假设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{}
不,不是这样.要进行静态类型化,需要在编译时知道类型信息.
您可以做的是声明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)