转到另一个包中的函数定义

pas*_*636 2 declaration function go

我读这个岗位约time.startTimer声明和定义。

从答案中,time.startTimer的声明src/time/sleep.go 如下:

func startTimer(*runtimeTimer)
Run Code Online (Sandbox Code Playgroud)

其定义src/runtime/time.go如下:

func startTimer(t *timer) {
    if raceenabled {
        racerelease(unsafe.Pointer(t))
    }
    addtimer(t)
}
Run Code Online (Sandbox Code Playgroud)

因此,似乎可以在一个.go文件中声明一个函数,然后在另一个.go文件中实现该函数。我尝试了相同的方法,例如,在a.go中声明了一个函数并在b.go中实现了该函数,但是当时,它总是失败go run a.go。这是正确的方法吗?如何声明在另一个.go文件中实现的功能?或中没有import任何内容。Go如何做到?sleep.gotime.go

谢谢

Jim*_*imB 5

如果您在startTimer正文上方的那一行看,将会看到go编译器的特殊指令:

//go:linkname stopTimer time.stopTimer
Run Code Online (Sandbox Code Playgroud)

编译命令文件

//go:linkname localname importpath.name
Run Code Online (Sandbox Code Playgroud)

// go:linkname指令指示编译器使用“ importpath.name”作为源代码中声明为“ localname”的变量或函数的目标文件符号名称。由于此伪指令可以破坏类型系统和程序包的模块化,因此仅在导入了“不安全”的文件中启用该伪指令。

  • 另请注意,用户代码中不应依赖所有杂用。[正如Dave Cheney所写](https://dave.cheney.net/2018/01/08/gos-hidden-pragmas),“ Pragma并不是语言的一部分。它们可以在gc编译器中实现,但是您将在规范中找不到它们。” [兼容性承诺](https://golang.org/doc/go1compat)不适用于编译指示。 (3认同)