为了账号安全,请及时绑定邮箱和手机立即绑定

通过节点调用golang函数时无法打开文件

通过节点调用golang函数时无法打开文件

Go
SMILET 2023-05-08 18:05:33
我按照https://medium.com/learning-the-go-programming-language/calling-go-functions-from-other-languages-4c7d8bcc69bf中的教程使我的节点应用程序能够调用 golang 函数。提供的示例就像一个魅力。但是,我确实无法在另一种情况下实施。在这里,我想通过仅提供绝对路径来打开一个文件并调用 Go 的函数,但它总是告诉我由于没有这样的文件而无法找到该文件。我试图直接在 Go 中运行它并且它有效!我做错了吗,或者这是一个实际的错误/未完成的功能?这是我为 c-style lib 构建的 golang 源代码:package mainimport "C"import (    "bufio"    "fmt"    "log"    "os")func main() {}//export ReadSomethingfunc ReadSomething(filePath string) {    file, err := os.Open(filePath)    if err != nil {        log.Fatal(err)    }    defer file.Close()    scanner := bufio.NewScanner(file)    for scanner.Scan() {        fmt.Println(scanner.Text())    }    if err := scanner.Err(); err != nil {        log.Fatal(err)    }}我用这个命令构建它:go build -buildmode=c-shared -o simpleread.so main.go
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

请记住,Go 中的字符串就像切片。它们由指向支持数据的指针和长度组成。这就是为什么在您的代码中GoString定义为:


var GoString = Struct({

    p: "string",  // pointer

    n: "longlong" // length

});

我建议你定义一个函数来创建一个GoStringeg


function NewGoString(str) {

    return new GoString({p: str, n: str.length})

}

您可以在代码中使用它,例如:


var simpleRead = ffi.Library("./simpleread.so", {

    ReadSomething: ["void", [GoString]]

});


simpleRead.ReadSomething(NewGoString("/path/to/your/file"))


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信