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){}
それはできますが、最適ではありません:
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
基本的に、値bool
のtrue
を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を実行するにはどうすればよいですか?
番号。
new
によって返されるゼロ値以外に、プリミティブ型へのポインターを定義する構文はありません。数値型と文字列についても同じことが言えます。
アドレスを取得する前に値を事前に作成するか、値がゼロのポインターを作成して、事実の後に新しい値を割り当てる必要があります。