web-dev-qa-db-ja.com

構造体リテラルでブールポインターをtrueに設定する方法は?

Boolポインターを受け入れる以下の関数があります。構造リテラルでisフィールドの値をtrueに設定できる表記法があるかどうか疑問に思っています。基本的に新しい識別子を定義することなく(i.e. var x := true ; handler{is: &x} )

package main

import "fmt"

func main() {
    fmt.Println("Hello, playground")
    check(handler{is: new(bool) })
}


type handler struct{
    is *bool
}

func check(is handler){}
22

それはできますが、最適ではありません:

h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true

基本的に、値booltrueを1つ持つスライスを作成し、最初の要素にインデックスを付けてアドレスを取得します。新しい変数は作成されませんが、ボイラープレートがたくさんあります(そして、最初の要素のアドレスが存在するまで、バッキング配列はメモリに残ります)。

より良い解決策は、ヘルパー関数を書くことです:

func newTrue() *bool {
    b := true
    return &b
}

そしてそれを使用して:

h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true

また、1行の匿名関数を使用して行うこともできます。

h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true

またはバリアント:

h := handler{is: func(b bool) *bool { return &b }(true)}

すべてのオプションを確認するには、他の答えを確認してください: Goでリテラル* int64を実行するにはどうすればよいですか?

25
icza

番号。

newによって返されるゼロ値以外に、プリミティブ型へのポインターを定義する構文はありません。数値型と文字列についても同じことが言えます。

アドレスを取得する前に値を事前に作成するか、値がゼロのポインターを作成して、事実の後に新しい値を割り当てる必要があります。

4
JimB