前言

wc的时候突然蹦出一个想法,golang bool是什么类型实现的。会和c一样吗? 既然有疑问,就做个实验看下。

如果bool的值为true,内存里面的值是?

这里可以使用内存强转的思路看下,是驴子是马拉出来溜溜。这里提醒下,使用内存强转一定要内存对齐,bool占一个字节。 如果不记得可以使用unsafe.Sizeof看下bool的内存占用。下面使用uint8对内存地址强转

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
	// 声明bool变量
	b := true

	// 验证下bool占的数据宽度,虽然记忆是1,但还是打印确认下
	fmt.Printf("%d", unsafe.Sizeof(b))

	// 强转内存对齐,看下值
	fmt.Printf("bool value = %d\n", *(*uint8)(unsafe.Pointer(&b)))

    //输出:1

从输出上看,bool是1 字节int无疑。这里不纠结uint8还是int8不涉及运算。这俩只是对那块内存块的解释不同。

如果给bool赋值为负数,是true还是false

1
2
3
4
5
6
7
8
9
     b := false
	// 看下负数是true or false
	*(*int8)(unsafe.Pointer(&b)) = -100

	if b {
		fmt.Printf("哈哈。。。证明负数转成bool也是true\n")
	}

    //输出fmt.Printf的值

通过上面的例子可以说明,boolint8 or uint8无疑。0false非零true