Go 带有 go:noescape 和 go:linkname 的源码怎么编译?

想用一下这两个 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

等于说对包名还有限制或是怎么着?

阅读 8.5k
推荐问题
宣传栏