web-dev-qa-db-fra.com

comment convertir bool en int8 dans golang

bitSet := true
var bitSetVar int8

Comment puis-je affecter bitSet à bitSetVar comme 1

Je peux le faire:

if bitSet {
   bitSetVar = 1
} else {
   bitSetVar = 0
}

Est-ce le meilleur moyen?

16
aerokite

Parce que la valeur zéro pour un int8 est 0, la branche else n'est pas nécessaire.

bitSet := true
var bitSetVar int8
if bitSet {
   bitSetVar = 1
}

Il n'y a pas conversions de bool en types entiers. L'instruction if est la meilleure que vous puissiez faire.

20
Cerise Limón

oui c'est le meilleur moyen (rapide et optimisé):

bitSet := true
bitSetVar := int8(0)
if bitSet {
    bitSetVar = 1
}

utiliser var bitSetVar int8 ou bitSetVar := int8(0) à l'intérieur d'une fonction est identique, et vous n'avez pas besoin de la partie else, parce que bitSetVar initialisé avec zéro avant cela if statment.
en utilisant if est OK (et rapide) comme cette fonction B2i:

func B2i(b bool) int8 {
    if b {
        return 1
    }
    return 0
}

mais vous avez une autre option en utilisant map aussi (pas aussi vite que if, mais agréable et beau à montrer ici):

var b2i = map[bool]int8{false: 0, true: 1}

comme cet exemple de code de travail (avec sorties commentées):

package main

import "fmt"

var b2i = map[bool]int8{false: 0, true: 1}

var i2b = []bool{false, true}

func B2i(b bool) int8 {
    if b {
        return 1
    }
    return 0
}
func main() {
    fmt.Println(B2i(true))  // 1
    fmt.Println(B2i(false)) // 0

    fmt.Println(b2i[true])  // 1
    fmt.Println(b2i[false]) // 0

    fmt.Println(i2b[1]) // true
    fmt.Println(i2b[0]) // false
}
4
user6169399

Votre méthode est actuellement la meilleure, car elle est rapide, avec la même manière que vous pouvez convertir int8 en bool, encore plus facilement. Vous pouvez également enregistrer 1 ligne:

var bitSetVar int8
if bitSet {
   bitSetVar = 1
}

La communauté Go a eu un problème pour implémenter cette conversion, mais il semble que tout le monde ne soit pas d'accord.

1
Alex Pliutau

En termes d'efficacité mémoire, en passant par votre approche du faire

if bitSet {
   bitSetVar = 1
} else {
   bitSetVar = 0
}

vous n'utilisez aucune variable supplémentaire pour définir votre bitSetVar, donc je dirais que c'est le meilleur que vous puissiez attendre.

En termes d'exécution, vous êtes:

  1. Vérification de la valeur de bitSet ne fois, qui est le moins de fois que vous devriez faire.

  2. Définir la valeur de bitSetVar ne fois, ce que vous avez l'intention de faire.

Jusqu'à présent, je dirais que vous avez été aussi efficace que possible.

En termes de lisibilité utilisateur, si vous pensez que ce petit extrait de code rend votre code moins présentable, vous pouvez le déplacer dans une fonction, peut-être l'appeler checkBitSetVar, comme ceci:

func checkBitSetVar(mybool bool) int8{
    if mybool{
        return 1
    }
    return 0    //you just saved youself an else here!
}

et pour l'essentiel, faites:

setBitVar = checkBitSetVar(bitSet)

Je pense que c'est le meilleur que vous puissiez tirer de Go.

0
Tanmay Garg