// 使用一个int控制N个开关,参考 sync.Mutex state 字段状态记录方式
type IntSwitch struct {
    state int32
}

// 枚举定义
const (
    switchFirst = 1 << iota // 十进制跟二进制都为1
    switchSecond // 十进制:2 二进制:10
    switchThird // 十进制:4 二进制:100
)

// 条件判断
data := IntSwitch{state: 7}
if data.state & switchThird == switchThird { // 比对最高一位
    fmt.Println("第三个开关为打开状态")
}

// 数据获取
fmt.Printf("第三个开关的状态为:%d", (data.state & switchThird) >> 2)
name := ""
switch platform {
    case "Android":
        name = "西红柿"
    case "iOS":
        name = "番茄"
    default:
        return fmt.Errorf("该不会是%s吧", "圣女果")
}

// 条件赋值巧用 map 来声明
name, ok := map[string]string{
    "Android": "西红柿",
    "iOS": "番茄",
}[platform]
if !ok {
    return fmt.Errorf("该不会是%s吧", "圣女果")
}
// 使用泛型实现类似PHP的in_array
// comparable 为可比较的类型
func In[T comparable](needle T, haystack []T) bool {
    for _, item := range haystack {
        if item == needle {
            return true
        }
    }
    return false
}

name := "猕猴桃"
if In(name, []string{"猕猴桃", "奇异果"}) {
    // code ...
}
// 两阶段延迟执行
// 可用于创建对象、释放对象,或者执行两阶段的逻辑
func TrackTime() func() {
    pre := time.Now()
    return func() {
        elapsed := time.Since(pre)
        fmt.Println("elapsed:", elapsed)
    }
}

func main() {
    defer TrackTime()()

    time.Sleep(500 * time.Millisecond)
}