web-dev-qa-db-ja.com

golangでboolをint8に変換する方法

bitSet := true
var bitSetVar int8

bitSetbitSetVarに1として割り当てるにはどうすればよいですか

私がすることができます:

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

これが最善の方法ですか?

16
aerokite

int8のゼロ値は0であるため、elseブランチは不要です。

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

boolから整数型への 変換 はありません。 ifステートメントが最善です。

20
Cerise Limón

はい、これが最良の方法です(高速で最適化された):

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

関数内で_var bitSetVar int8_またはbitSetVar := int8(0)を使用することは同じであり、else部分の前にbitSetVarがゼロで初期化されるため、if部分は必要ありません。
ifの使用中は、この_B2i_関数のようにOK(かつ高速)です。

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

ただし、mapを使用する別のオプションもあります(ifほど高速ではありませんが、ここに表示するのは美しくて美しいです)。

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

このコメント付きの作業サンプルコードのように:

_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

Int8をboolに変換できるのと同じ方法で、さらに簡単に、高速であるため、現在の方法が最適です。また、1行を保存できます。

var bitSetVar int8
if bitSet {
   bitSetVar = 1
}

Goコミュニティにはこの変換を実装する問題がありましたが、すべての人が同意しているわけではないようです。

1
Alex Pliutau

メモリ効率の観点から、あなたのアプローチによって

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

bitSetVarを設定するために余分な変数を使用していないため、これが期待できる最高の方法だと思います。

ランタイムに関しては、次のとおりです。

  1. BitSet onceの値を確認します。これは、実行すべき最小回数です。

  2. BitSetVar onceの値を設定します。

今まで、できる限り効率的だったと思います。

ユーザーの読みやすさの観点から、この小さなコードスニペットがコードの見栄えを悪くしていると感じた場合は、次のように関数に変更することができます。

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

そして、主に:

setBitVar = checkBitSetVar(bitSet)

これはGoから抜け出すことができる最高のものだと思います。

0
Tanmay Garg