package main

import "fmt"

// 一个布尔类型的值只有两种：true和false。
// if和for语句的条件部分都是布尔类型的值，
// 并且==和<等比较操作也会产生布尔型的值。
// 一元操作符!对应逻辑非操作，因此!true的值为false

func main() {
	// 布尔值可以和&&（AND）和||（OR）操作符结合，并且有短路行为：
	// 如果运算符左边值已经可以确定整个布尔表达式的值，
	// 那么运算符右边的值将不再被求值。
	var bool1 bool = true
	// 再遇到第一个false时，此语句以及判断为假，不需要再判断bool1的值
	bool1 = false && bool1 // false
	fmt.Println(bool1)
	// 同理||也是一样的，当遇到一个true时语句以及判断为真，不需要判断后半段的值
	bool1 = true || bool1 // true
	fmt.Println(bool1)

	// 布尔值并不会隐式转换为数字值0或1，反之亦然。必须使用一个显式的if语句辅助转换：
	i := 0
	b := true
	if b {
		i = 1
	}
	fmt.Println(i)

	// 可以选择将其包装成一个函数
	// btoi returns 1 if b is true and 0 if false.
	bToi := func(b bool) int {
		if b {
			return 1
		}
		return 0
	}
	fmt.Println(bToi(false)) // 0

	// 数字到bool也可以转换
	// itob reports whether i is non-zero.
	iTob := func(i int) bool { return i != 0 }
	fmt.Println(iTob(1314)) // true
	fmt.Println(iTob(0))    // false

}
