как конвертировать bool в int8 в golang [дубликат]

этот вопрос уже есть ответ здесь:

bitSet := true
var bitSetVar int8

как я могу назначить bitSet to bitSetVar в 1

Я могу сделать это:

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

Это лучший способ?

4 ответов


потому что нулевое значение для int8 is 0, ветка else не нужна.

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

нет преобразование С bool к целочисленным типам. Оператор if-лучшее, что вы можете сделать.


да это самый лучший способ (быстрый и оптимизированный):

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

используя var bitSetVar int8 или bitSetVar := int8(0) внутри функции то же самое, и вам не нужно else часть, потому что bitSetVar инициализируется нулем, до этого if statment.
при использовании if в порядке (и быстро), как это B2i функция:

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
}

ваш путь в настоящее время является лучшим, потому что это быстро, так же, как вы можете конвертировать int8 в bool, еще проще. Также вы можете сохранить 1 строчку:

var bitSetVar int8
if bitSet {
   bitSetVar = 1
}

у сообщества Go была проблема с реализацией этого преобразования, но, похоже, не все люди согласны.


С точки зрения эффективности памяти, судя по вашему подходу к ведению

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

вы не используете никаких дополнительных переменных для установки вашего bitSetVar, поэтому я бы сказал, что это лучшее, что вы могли ожидать.

С точки зрения времени выполнения, вы находитесь:

  1. проверка значения bitSet после, что является наименьшим количеством раз, когда вы должны делать.

  2. установка значения bitSetVar после, что вы и намерены сделать.

до, я бы сказал, что вы были настолько эффективны, насколько это возможно.

С точки зрения читаемости пользователя, если вы чувствуете, что этот маленький фрагмент кода делает ваш код менее презентабельным, вы можете перенести его в функцию, возможно, назовите ее checkBitSetVar, например:

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

и в основном, сделайте:

setBitVar = checkBitSetVar(bitSet)

Я думаю, что это лучшее, что вы можете получить от Go.