Golang const不安全,

mnemlml8  于 2022-12-20  发布在  Go
关注(0)|答案(2)|浏览(180)

不明白为什么我可以

const OK = uint64(0)

const OK = int(unsafe.Sizeof(uint64(0)))

但不是这个

const NOK = binary.Size(uint64(0))
smtd7mpg

smtd7mpg1#

specification中对此进行了解释。
包unsafe在编译器中实现。表达式unsafe.Sizeof(uint64(0))可以在编译时求值。它是常量表达式。
无法在编译时计算普通函数调用binary.Size(uint64(0))。它不是常量表达式。
常量声明需要常量表达式。

fcg9iug3

fcg9iug32#

这里要提到的一件事是,如果类型是来自类型参数,那么规范会考虑类型 * variable sized*,所以会运行一些代码(可能是reflection)来计算大小。因此,使用unsafe.Sizeof()本身必须在运行时做一些事情来计算大小,即使实际类型能够在编译时知道。

func [T constraints.Integer] WhatIsTheFrequencyKenneth(n T) uintptr {
    return unsafe.Sizeof(n)
}

fmt.Println("I had to generate code to tell you this: ", WhatIsTheFrequencyKenneth(int64(42)))

相关问题