web-dev-qa-db-fra.com

Comment définir le pointeur bool sur true dans la structure littérale?

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){}
22

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?

25
icza

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.

4
JimB