go-duktape存储库没有“问题”部分或者无论如何都要求帮助。
自述文件中没有有用的例子。
我正在尝试在javascript文件中定义一个函数(带参数和返回值)并从go调用此函数。
Javascript文件:
function hello(name, age){
return "Hello " + name + " you are " + age;
}
事情的方方面面是什么样的?
答案 0 :(得分:0)
这是我第一次使用这段代码,并且可能有另一种方法可以在不使用json的情况下获取整个对象,但到目前为止,我还没有找到它。我希望我能帮到你。
package main
import (
"github.com/olebedev/go-duktape"
"fmt"
"time"
)
func main() {
start := time.Now()
ctx := duktape.New()
ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int {
i := -1
for {
if c.GetType(i).IsNone() == true {
break
}
if i < -100 {
break
}
if c.GetType(i).IsString() == true {
fmt.Println(c.SafeToString(i))
}
if c.GetType(i).IsNumber() == true {
fmt.Println(c.GetNumber(i))
}
if c.GetType(i).IsObject() == true {
c.ToObject(i)
fmt.Printf( "%v\n", c.JsonEncode(i) )
}
i -= 1
}
return 0
})
ctx.PevalString(`log({'hello':'word'})`)
ctx.DestroyHeap()
elapsed := time.Since(start)
fmt.Printf("total time: %s\n", elapsed)
}
答案 1 :(得分:0)
这是另一种做法
package main
import (
"github.com/olebedev/go-duktape"
"fmt"
"time"
)
func print_name (c *duktape.Context) int {
c.PushThis()
c.GetPropString(-1, "name")
fmt.Printf( "My name is: %v\n", c.SafeToString(-1) )
return 0
}
func myobject_constructor (c *duktape.Context) int {
if c.IsConstructorCall() == false {
return duktape.ErrRetType
}
c.PushThis()
c.Dup( 0 )
c.PutPropString(-2, "name")
return 0
}
func main() {
start := time.Now()
ctx := duktape.New()
/*
function MyObject(name) {
// When called as new MyObject(), "this" will be bound to the default
// instance object here.
this.name = name;
// Return undefined, which causes the default instance to be used.
}
// For an ECMAScript function an automatic MyObject.prototype value will be
// set. That object will also have a .constructor property pointing back to
// Myobject. You can add instance methods to MyObject.prototype.
MyObject.prototype.printName = function () {
print('My name is: ' + this.name);
};
var obj = new MyObject('test object');
obj.printName(); // My name is: test object
*/
ctx.PushGoFunction(myobject_constructor)
ctx.PushObject()
ctx.PushGoFunction(print_name)
ctx.PutPropString(-2, "printName")
ctx.PutPropString(-2, "prototype")
ctx.PutGlobalString("MyObject")
/*
make this
*/
ctx.EvalString( "var a = new MyObject('test name one');" )
ctx.EvalString( "a.printName();" )
/*
or make this
*/
ctx.EvalString( "new MyObject('test name two');" )
ctx.GetPropString(-1, "printName")
ctx.Dup(-2)
ctx.CallMethod(0)
ctx.Pop()
ctx.Pop()
ctx.GetGlobalString("MyObject")
ctx.DestroyHeap()
elapsed := time.Since(start)
fmt.Printf("total time: %s\n", elapsed)
}