猿问

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

我按照https://medium.com/learning-the-go-programming-language/calling-go-functions-from-other-languages-4c7d8bcc69bf中的教程使我的节点应用程序能够调用 golang 函数。提供的示例就像一个魅力。
但是,我确实无法在另一种情况下实施。在这里,我想通过仅提供绝对路径来打开一个文件并调用 Go 的函数,但它总是告诉我由于没有这样的文件而无法找到该文件。我试图直接在 Go 中运行它并且它有效!
我做错了吗,或者这是一个实际的错误/未完成的功能?

这是我为 c-style lib 构建的 golang 源代码:

package main


import "C"


import (

    "bufio"

    "fmt"

    "log"

    "os"

)


func main() {}


//export ReadSomething

func 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


SMILET
浏览 106回答 1
1回答

胡子哥哥

请记住,Go 中的字符串就像切片。它们由指向支持数据的指针和长度组成。这就是为什么在您的代码中GoString定义为:var GoString = Struct({    p: "string",  // pointer    n: "longlong" // length});我建议你定义一个函数来创建一个GoStringegfunction 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"))
随时随地看视频慕课网APP

相关分类

Go
我要回答