J'ai la fonction ci-dessous qui accepte un pointeur booléen. Je me demande s'il existe une notation qui me permet de définir la valeur du champ is
sur true
dans le littéral struct; essentiellement sans définir un nouvel identifiant (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){}
Vous pouvez le faire mais ce n'est pas optimal:
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
Fondamentalement, il crée une tranche avec un bool
de valeur true
, indexe son premier élément et prend son adresse. Aucune nouvelle variable n'est créée, mais il y a beaucoup de passe-partout (et le tableau de sauvegarde restera en mémoire jusqu'à ce que l'adresse de son premier élément existe).
Une meilleure solution serait d'écrire une fonction d'aide:
func newTrue() *bool {
b := true
return &b
}
Et en l'utilisant:
h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true
Vous pouvez également le faire avec une fonction anonyme à une ligne:
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true
Ou une variante:
h := handler{is: func(b bool) *bool { return &b }(true)}
Pour voir toutes vos options, consultez mon autre réponse: Comment puis-je faire un littéral * int64 dans Go?
Non.
Il n'y a pas de syntaxe pour définir un pointeur vers un type primitif, autre que la valeur zéro renvoyée par new
. Il en va de même pour les types numériques et les chaînes.
Vous devez soit créer une valeur avant de prendre l'adresse de, soit créer le pointeur avec une valeur nulle et attribuer une nouvelle valeur après coup.