介绍
Energy Go中定义的变量、结构和函数绑定,在JS中使用。
在Energy中不只可以调用 JS 和 事件机制,也可以通过Go绑定在Go中定义的一些变量函数在JS中调用,在使用的时候就如同在JS调用本身定义的函数一样方便。
运行此示例,需要安装好Go和Energy开发环境:教程一 环境安装
此示例中采用了内置http服务访问内嵌资源: 内置http服务
在Go中绑定使用cef.VariableBind.VariableCreateCallback变量创建初始化函数绑定,
支持类型,目前只支持 String, Integer, Boollean, Double(float64), null, undefiend, function
不支持类型 Object, Array
绑定的变量区分为通用类型和结构类型,每个类型都有自己的根对象,在window下为
结构类型: window.goobj
通用类型: window.gocobj
在应用初始化时通过ApplicationConfig对象的SetCommonRootName和SetObjectRootName设置根对象名称
在html中取值、赋值、函数调用
通用类型和结构类型取赋值方式一样,直接通过变量名
字段取值 var demoVar = goobj.demo
字段赋值 goobj.demo='新值'
函数调用 goobj.funcName(xxx,xxx)
在绑定变量初始化函数中使用bind.NewXXXX(“name”,[初始值])
通用类型变量可任意更改变量值的类型,在GO中使用时需要类型判断,否则取值失败。
变量值存放在主进程(browser)中,与渲染进程共享。
在Go和Web中共享这些变量可直接修改
在绑定变量初始化函数中使用bind.NewObjects(…array)进行结构类型绑定
在Go中定义的struts类型, 该类型变量类型不可更改
变量值存放在主进程(browser)中,与渲染进程共享。
在Go和Web中共享这些变量可直接修改
结构内定义的字段为绑定的字段,首字母需大写,否则绑定不成功。
结构类型和通用类型都可定义函数,函数名需首字母大写
入参最多9个,可带有1个返回值
示例中,在cef.VariableBind.VariableCreateCallback变量绑定函数中对通用类型变量和结构类型进行了绑定
通用类型,使用bind.NewXXX的方式
结构类型,使用bind.NewObjects的方式
main.go
package mainimport ("embed""fmt""github.com/energye/energy/cef""github.com/energye/energy/common/assetserve""github.com/energye/energy/example/browser-go-bind-js-var/src"
)//go:embed resources
var resources embed.FSfunc main() {//全局初始化 每个应用都必须调用的cef.GlobalCEFInit(nil, &resources)//创建应用cefApp := cef.NewApplication(nil)//指定一个URL地址,或本地html文件目录cef.BrowserWindow.Config.DefaultUrl = "http://localhost:22022/go-bind-js-var.html"cef.BrowserWindow.Config.Title = "Energy - execute-javascript"cef.BrowserWindow.Config.Icon = "resources/icon.ico"//内置http服务链接安全配置cef.SetBrowserProcessStartAfterCallback(func(b bool) {fmt.Println("主进程启动 创建一个内置http服务")//通过内置http服务加载资源server := assetserve.NewAssetsHttpServer()server.PORT = 22022server.AssetsFSName = "resources" //必须设置目录名server.Assets = &resourcesgo server.StartHttpServer()})//变量创建回调-这个函数在主进程(browser)和子进程(render)中执行//变量的值绑定到主进程cef.VariableBind.VariableCreateCallback(func(browser *cef.ICefBrowser, frame *cef.ICefFrame, bind cef.IProvisionalBindStorage) {//初始化要绑定的变量//结构类型src.JSStructVarDemo = &src.StructVarDemo{}src.JSStructVarDemo.StringField = "初始的字符串值"bind.NewObjects(src.JSStructVarDemo)//通用类型src.JSString = bind.NewString("JSString", "初始的字符串值")src.JSInt = bind.NewInteger("JSInt", 0)src.JSBool = bind.NewBoolean("JSBool", false)src.JSDouble = bind.NewDouble("JSDouble", 0.0)_ = bind.NewFunction("JSFunc", src.JSFunc)})//运行应用cef.Run(cefApp)
}
src/common-var.go
定义了通用类型变量
package srcimport ("fmt""github.com/energye/energy/cef"
)var (JSString *cef.JSStringJSInt *cef.JSIntegerJSBool *cef.JSBooleanJSDouble *cef.JSDouble
)func JSFunc(p1 string) string {fmt.Println("Go中执行JSFunc 参数:", p1)var ret string//类型判断if JSString.IsString() {ret = JSString.Value()} else if JSString.IsInteger() {//web js 中改变成integer类型intVal, _ := JSString.IntegerValue()ret = fmt.Sprintf("%d", intVal)}fmt.Println("JSString:", ret, "JSInt:", JSInt.Value(), "JSBool:", JSBool.Value(), "JSDouble:", JSDouble.Value())return p1 + " Go返回的值: " + ret
}
src/struct-var.go
定义了结构
package srcimport "fmt"var JSStructVarDemo *StructVarDemo//定义结构类型的变量
//结构类型将属性和函数导出为JS可调用类型
//大写字母开头
type StructVarDemo struct {StringField stringIntField int32BoolField boolFloatField float64noExportField string //小写字母无法绑定到js
}//结构类型的函数导出
func (m *StructVarDemo) StringValue(p0 string) string {fmt.Println("结构类型绑定函数 StringValue 被调用 入参:", p0)return m.StringField + p0
}//结构类型的函数导出
func (m *StructVarDemo) IntValue(intParam int32) int32 {fmt.Println("结构类型绑定函数 IntValue 被调用 入参:", intParam)return m.IntField + intParam
}//定义导出函数参数最多为9个
func (m *StructVarDemo) FuncMaxParam(p1, p2, p3, p4, p5, p6, p7, p8, p9 string) {fmt.Println("结构类型绑定函数 FuncMaxParam 被调用 入参:", p1, p2, p3, p4, p5, p6, p7, p8, p9)
}
在html中直接使用根对象调用函数
通用类型 gocobj.XXX
结构类型 goobj.XXX
通用类型可任意改变值类型(所支持的类型)
结构类型不可改变值类型(只能是go中定义的类型)
execute-go-bind-js-var
execute-go-bind-js-var:
结构类型:
通用类型:
