有没有办法将整数转换为bools,反之亦然?

时间:2011-12-06 00:40:54

标签: types go

是否有内置方法将bool转换为整数,反之亦然?我尝试过普通的转换,但由于它们使用不同的底层类型,转换是不可能的经典方式。我已经倾注了一些规范,但我还没有找到答案。

7 个答案:

答案 0 :(得分:32)

Int to bool很容易,只需x != 0即可。换句话说,由于Go不支持三元运算符,您必须这样做:

var x int
if b {
    x = 1
} else {
    x = 0
}

你当然可以把它放在一个函数中:

func Btoi(b bool) int {
    if b {
        return 1
    }
    return 0
 }

对于整数有很多可能的布尔解释,它们都不一定是自然的,有必要说出你的意思。

根据我的经验(YMMV),如果您正在编写好的代码,则不必经常这样做。有时候它很有吸引力,能够根据布尔值编写数学表达式,但是你的维护者会感谢你避免使用它。

答案 1 :(得分:6)

以下是从int转换为bool的技巧:

x := 0
newBool := !(x == 0) // returns false

其中x是您要转换的int变量。

答案 2 :(得分:5)

var a int = 3
var b bool = a != 0

我刚把它放到demo box上的golang front page

package main

import "fmt"

func main() {
 var a int = 3
 var b bool = a != 0
    fmt.Println("Hello, 世界", b)
}

输出:

Hello, 世界 true

答案 3 :(得分:2)

bool到整数类型都没有conversions,反之亦然。

使用inequality运算符将整数转换为bool值:

b := i != 0

使用if语句将bool转换为整数类型:

var i int
if b {
    i = 1
}

因为整数类型的零值为0,所以不需要其他答案中所示的else分支。

答案 4 :(得分:2)

仅显示TMTOWTDT

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Println(bool2int(true))
    fmt.Println(bool2int(false))
}

func bool2int(a bool) uint64 {
    return *(*uint64)(unsafe.Pointer(&a))&1
}

https://play.golang.org/p/eULE6cJO_c0

答案 5 :(得分:0)

要设置布尔类型的数字类型,最好使用if语句。请参阅@MuffinTop非常好的答案和https://stackoverflow.com/a/38627381/12817546。从布尔值设置布尔值和字符串类型时也是如此。

package main

import (
    . "fmt"
    . "strconv"
)

func main() {
    var e []interface{}
    t := true
    if t {
        by := []byte{'G', 'o'}
        r := []rune{rune(by[0]), 111}
        f := 70.99
        s := Sprintf("%.f", f)
        i, _ := Atoi(s) // Atoi "ASCII to integer"
        bo := !(t == true)
        // var bo bool = t != true
        e = []interface{}{by[0], r[0], f, s, i, bo}
    }
    checkType(e)
}

func checkType(s []interface{}) {
    for k, _ := range s {
        // uint8 71, int32 71, float64 70.99, string 71, int 71, bool false
        Printf("%T %v\n", s[k], s[k])
    }
}

您可以像{SamehShara所说的那样使用bo := !(t == true)或像@MattJoiner所说的那样使用var bo bool = t != true来设置布尔值。这里,t值为true的布尔值被设置为bo值为false的布尔值。

要通过truefalse布尔值设置“ true”或“ false”字符串,请使用fmt.Sprintf("%v", t)。参见https://stackoverflow.com/a/47413424/12817546strconv.ParseBool("true")反之。参见https://stackoverflow.com/a/53093945/12817546。行情已编辑。

答案 6 :(得分:0)

你可以使用地图:

package main

var (
   isZero = map[int]bool{0: true}
   intVal = map[bool]int{true: 1}
)

func main() {
   println(isZero[-2]) // false
   println(isZero[-1]) // false
   println(isZero[0]) // true
   println(isZero[1]) // false
   println(isZero[2]) // false
   
   println(intVal[false]) // 0
   println(intVal[true]) // 1
}