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
Libérer: 2025-01-14 10:23:45
original
662 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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

<code class="language-go">var _ = aStringConst[0]
//或者
const _ = 1 / len(aStringConst)</code>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal