教程九 在Go中使用Energy创建跨平台GUI应用 - Go绑定变量JS调用
创始人
2024-03-08 01:53:29

 


 

介绍

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个返回值

Go代码示例

示例中,在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代码示例

在html中直接使用根对象调用函数

通用类型 gocobj.XXX

结构类型 goobj.XXX

通用类型可任意改变值类型(所支持的类型)

结构类型不可改变值类型(只能是go中定义的类型)



execute-go-bind-js-var


execute-go-bind-js-var:
结构类型:
通用类型:

效果图

 

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...