不明白为什么我可以
const OK = uint64(0) const OK = int(unsafe.Sizeof(uint64(0)))
但不是这个
const NOK = binary.Size(uint64(0))
smtd7mpg1#
在specification中对此进行了解释。包unsafe在编译器中实现。表达式unsafe.Sizeof(uint64(0))可以在编译时求值。它是常量表达式。无法在编译时计算普通函数调用binary.Size(uint64(0))。它不是常量表达式。常量声明需要常量表达式。
unsafe.Sizeof(uint64(0))
binary.Size(uint64(0))
fcg9iug32#
这里要提到的一件事是,如果类型是来自类型参数,那么规范会考虑类型 * variable sized*,所以会运行一些代码(可能是reflection)来计算大小。因此,使用unsafe.Sizeof()本身必须在运行时做一些事情来计算大小,即使实际类型能够在编译时知道。
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)))
2条答案
按热度按时间smtd7mpg1#
在specification中对此进行了解释。
包unsafe在编译器中实现。表达式
unsafe.Sizeof(uint64(0))
可以在编译时求值。它是常量表达式。无法在编译时计算普通函数调用
binary.Size(uint64(0))
。它不是常量表达式。常量声明需要常量表达式。
fcg9iug32#
这里要提到的一件事是,如果类型是来自类型参数,那么规范会考虑类型 * variable sized*,所以会运行一些代码(可能是reflection)来计算大小。因此,使用
unsafe.Sizeof()
本身必须在运行时做一些事情来计算大小,即使实际类型能够在编译时知道。