Maison >développement back-end >Golang >Assertions au moment de la compilation dans Go (Golang)

Assertions au moment de la compilation dans Go (Golang)

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-14 10:23:45755parcourir

Compile-Time Assertions in Go (Golang)

Le mécanisme d'assertion au moment de la compilation du langage Go est utilisé pour appliquer des conditions ou des contraintes spécifiques au stade de la compilation plutôt qu'au moment de l'exécution. Si les conditions ne sont pas remplies, le processus de compilation échouera et signalera une erreur, ce qui permettra de détecter les erreurs le plus tôt possible et de garantir que le programme satisfait certains invariants ou hypothèses avant son exécution.

Les assertions au moment de la compilation sont souvent utilisées pour :

  • Assurez-vous que la taille de la structure des données est celle prévue.
  • Vérifiez que la valeur d'une constante ou d'une expression est celle attendue.
  • Appliquer des contraintes de type ou d'autres contrôles au moment de la compilation.

Assertions de compilation en langage Go

Le langage Go lui-même ne prend pas directement en charge les assertions au moment de la compilation comme certains autres langages. Cependant, nous pouvons obtenir des fonctionnalités similaires avec quelques techniques intelligentes. Voici quelques méthodes courantes :

Afficher qu'une expression booléenne constante est vraie (ou fausse) au moment de la compilation :

Nous pouvons profiter des fonctionnalités suivantes :

La spécification du langage Go stipule clairement que les clés constantes dans les littéraux composites map/slice/array ne peuvent pas être répétées.

Par exemple, le code suivant garantit que l'expression booléenne constante aBoolConst est vraie. Si c'est faux, le code ne sera pas compilé.

<code class="language-go">const aBoolConst = true
var _ = map[bool]int{false: 0, aBoolConst: 1}</code>

Affirmez que la longueur de la chaîne constante est de 15 :

<code class="language-go">const STR = "abcdefghij12345"
var _ = map[bool]int{false: 0, len(STR) == 15: 1}</code>

Affirmer que l'entier constant est 15 :

<code class="language-go">var _ = [1]int{len(STR) - 15: 0}
//或者
var _ = [1]int{}[len(STR) - 15]</code>

Affirmer que la constante X n'est pas inférieure à la constante Y :

<code class="language-go">const _ uint = X - Y
//或者
type _ [X - Y]int</code>

Affirmer que la chaîne constante n'est pas vide :

<code class="language-go">var _ = aStringConst[0]
//或者
const _ = 1 / len(aStringConst)</code>

Utiliser la vérification de la taille du tableau :

<code class="language-go">import "unsafe"

type MyStruct struct {
    A int64
    B int64
}

// 确保结构体大小为16字节
var _ = [1]int{int(unsafe.Sizeof(MyStruct{}) - 16): 0}</code>

Longueur de l'énumération d'affirmation :

<code class="language-go">type enumType int

const (
    EnumA enumType = iota
    EnumB
    EnumC
    end
)

var enumDescriptions = [...]string{
    EnumA: "first",
    EnumB: "second",
    EnumC: "third",
}

func (e enumType) String() string {
    if e == end {
        panic("invalid value")
    }
    return enumDescriptions[e]
}

var _ = [1]int{}[len(enumDescriptions) - int(end)]

func _() {
    var x [1]struct{}
    _ = x[EnumA - 0]
    _ = x[EnumB - 1]
    _ = x[EnumC - 2]
}</code>

Utilisez la fonction init et panic :

Bien qu'il ne s'agisse pas strictement d'une assertion au moment de la compilation, vous pouvez utiliser la fonction init pour effectuer des vérifications qui échoueront au démarrage du programme (agissant effectivement comme une assertion d'exécution lors de l'initialisation) :

<code class="language-go">const ExpectedSize = 8

var myInt int64

func init() {
    if unsafe.Sizeof(myInt) != ExpectedSize {
        panic("int size is not 8 bytes")
    }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn