引言

今天写代码,发现bool不能直接强转成int,这就导致如下代码编译错误

type Status int
const StatusSuccess Status = 1
...

status := StatusSuccess
succ += int(status == StatusSuccess)

这种在其他语言,例如 c++看起来非常自然的强转为啥 golang 不支持呢?

第二个问题

于是开始 Google,搜到这篇博客,作者用了 7 中方法实现 bool 转 int ,这里摘抄几个。

方法 1

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

方法 2

func Bool2int(b bool) int {
    // The compiler currently only optimizes this form.
    // See issue 6011.
    var i int
    if b {
        i = 1
    } else {
        i = 0
    }
    return i
}

方法 7

func fastBoolConv(b bool) int {
    return int(*(*byte)(unsafe.Pointer(&b)))
}

性能对比

way 1 6449ms
way 2 2868ms
way 3 6378ms
way 6 7268ms
way 7 2987ms

尝试去看方法 2 为啥比方法 1 快,但是没有看懂,有大佬能解释下吗,issue 6011

举报· 210 次点击
登录 注册 站外分享
1 条回复  
shiyunjin 小成 2024-11-12 20:53:05
https://0x0f.me/blog/golang-compiler-optimization/ 这篇文章不是解释了吗? 编译器优化了
Kisesy 小成 2024-11-12 21:10:46
我测了一下,go 1.23 方法 1 跟 2 好像都优化了
Trim21 小成 2024-11-12 21:30:34
@Kisesy #2 1 没有 https://godbolt.org/z/ef93PTPaj
返回顶部