想用一下这两个 annotation, 然后就写了一个样例。
目录结构:
[test]$ tree
.
├── main.go
├── pri
│ └── a.go
└── pub
└── b.go
pri/a.go:
package pri
import (
"fmt"
)
func rua() int64 {
fmt.Println("rua in pri")
return 1
}
pub/b.go
package pub
import (
"unsafe"
)
var _ = unsafe.Sizeof(0)
//go:noescape
//go:linkname rua test/pri.rua
func rua() int64
func Rua() int64 {
return rua()
}
main.go
package main
import (
"test/pub"
)
func main() {
println(pub.Rua())
}
然后我 go run main.go
提示编译错误
# test/pub
pub/b.go:11: missing function body for "rua"
然后我去查了一下,发现这是个 known issue,于是我就用了 workaround, 在 pub 里加了个空汇编文件。
[test]$ tree
.
├── main.go
├── pri
│ └── a.go
└── pub
├── issue15006.s
└── b.go
结果重新编译还是不行:
# command-line-arguments
test/pub.Rua: test/pri.rua: not defined
test/pub.Rua: undefined: test/pri.rua
等于说对包名还有限制或是怎么着?