17

Golangでこのような条件付き変数の型宣言を行うことは可能ですか?

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

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

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

上記は機能しませんが、normalResult と adminResults は非常によく似た構造体であり、これを行うにはどうすればよいでしょうか?

ありがとうございました!

4

2 に答える 2

8

いいえ、そうではありません。静的に型付けされるため、コンパイル時に型情報を知る必要があります。

あなたができることはresult、AdminResult と NormalResult の両方を満たす何らかのタイプのインターフェースとして宣言することです。次に、実行時に型アサーションを使用して、結果の型を決定できます。

result( Go はブロック スコープであるため、if ブロックの外でも宣言する必要があります)

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)

}
于 2013-10-09T18:52:06.707 に答える
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{}

于 2013-10-09T18:47:52.103 に答える