Go编译器运行时的语法和语义

Sha*_*oya 2 c namespaces go

我在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方言的一部分吗?

pet*_*rSO 6

这是Go的包路径的特殊内部语法.例如,

runtime?pprof·runtime_cyclesPerSecond

runtime_cyclesPerSecond包路径中的功能runtime?pprof.

' ?'字符是Unicode分割斜杠字符,用于分隔路径元素.' ·'字符是Unicode中点字符,它分隔包路径和函数.


mic*_*ica 5

?·朋友只是随机的Unicode字符,有人决定放入函数名称.模糊的Unicode字符(编辑:在C99标准的附录D中列出(本PDF的第452-453页) ;另请参见此处)与C标识符一样合法A7(在您的普通支持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. 如这里所讨论的,这可能是一个扩展.)