^(0xFFFF << 48)是一个无类型的常数,它是一个任意大的值。
0xffff << 48是
0xffff000000000000。取反时,得到
-0xffff000000000001(由于补码为-x = ^ x
+ 1或^ x =-(x + 1))。
当您编写时
userid :=12345,
userid获取类型
int。然后,当您尝试将
&其与未类型化的常量
-0xffff000000000001进行()编译时,编译器会认为此常量必须为
int。在这一点上,编译器会抱怨,因为该值的大小太大而不能成为
int。
如果您尝试获取常量
0x0000ffffffffffff,则可以使用
1<<48 -1,它将适合您(如果您具有64位整数)。由于如果您的代码
int是32位,将永远无法工作,因此您应该
int64在代码中使用而不是
int使其可移植。
博客文章https://blog.golang.org/constants解释了常量的工作原理,以及为什么它们是常量的背景。



