我在go运行时查看了runtime.c文件
/usr/local/go/src/pkg/runtime
Run Code Online (Sandbox Code Playgroud)
并看到以下函数定义:
void
runtime?pprof·runtime_cyclesPerSecond(int64 res)
{...}
Run Code Online (Sandbox Code Playgroud)
和
int64
runtime·tickspersecond(void)
{...}
Run Code Online (Sandbox Code Playgroud)
并且有很多声明像
void runtime·hashinit(void);
Run Code Online (Sandbox Code Playgroud)
在runtime.h中.
我之前没有看到过这种C语法(特别是带有斜杠的语法似乎很奇怪).这是std C或某种plan9方言的一部分吗?
这是Go的包路径的特殊内部语法.例如,
runtime?pprof·runtime_cyclesPerSecond
是runtime_cyclesPerSecond包路径中的功能runtime?pprof.
' ?'字符是Unicode分割斜杠字符,用于分隔路径元素.' ·'字符是Unicode中点字符,它分隔包路径和函数.
?和·朋友只是随机的Unicode字符,有人决定放入函数名称.模糊的Unicode字符(编辑:在C99标准的附录D中列出(本PDF的第452-453页) ;另请参见此处)与C标识符一样合法A或7(在您的普通支持Unicode的编译器中,无论如何) .
Char| Hex| Octal|Decimal|Windows Alt-code
----+------+------+-------+----------------
? |0x2215|021025| 8725| (null)
· | 0xB7| 0267| 183| Alt+0183
Run Code Online (Sandbox Code Playgroud)
在函数名称中放置看起来像运算符但不是(U + 2215 ?,特别是类似于U + 2F /(除法)的字符)可能是一个令人困惑的做法,所以我个人建议反对它.很明显,Go团队中有人认为,无论他们将其包含在功能名称中的原因都超过了混淆的可能性.
(编辑:应该注意的?是附件D没有明确允许U + 2215. 如这里所讨论的,这可能是一个扩展.)