去另一个包中的函数定义

时间:2018-01-25 14:46:17

标签: function go declaration

我正在阅读有关time.startTimer声明和定义的example帖子。

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

func startTimer(*runtimeTimer)

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

func startTimer(t *timer) {
    if raceenabled {
        racerelease(unsafe.Pointer(t))
    }
    addtimer(t)
}

因此,您似乎可以在一个.go文件中声明一个函数,并在另一个.go文件中实现它。我尝试了相同的方法,例如,在a.go中声明一个函数并在b.go中实现它,但它在go run a.go时总是失败。这是正确的方法吗?如何声明在另一个.go文件中实现的函数? importsleep.go中没有time.go。 Go怎么做?

由于

1 个答案:

答案 0 :(得分:4)

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

//go:linkname stopTimer time.stopTimer

来自compile command documentation

//go:linkname localname importpath.name
     

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