注册 登录

清河洛

wails通过js调用Go

qingheluo2024-08-28清河洛486
在wails中,我们可以通过js调用Go函数,在调用过程中会自动进行Go和js的数据类型互转,如结Go的构体转化为js对象,Go的数组和切片转化为js数组这都是通过js运行库来实现的,js运行库是在运行build或dev命令后由wails自动生成的,位于前端根目录下的wailsjs目录,可通过项目配置文件中的wailsjsdir选项来修改在wails中,通过应用配置中的Bind字段传递结构体实例列表来向前端暴露传递的结构体的公开方法(大写字母开头)程序启动时,会检查Bind字段并列出这些结构体实例的所有方法,确定哪些方法是公开的(大写字母开头),然后生成前端可以调用的这些公开方法的js版...

在wails中,我们可以通过js调用Go函数,在调用过程中会自动进行Go和js的数据类型互转,如结Go的构体转化为js对象,Go的数组和切片转化为js数组

这都是通过js运行库来实现的,js运行库是在运行build或dev命令后由wails自动生成的,位于前端根目录下的wailsjs目录,可通过项目配置文件中的wailsjsdir选项来修改

在wails中,通过应用配置中的Bind字段传递结构体实例列表来向前端暴露传递的结构体的公开方法(大写字母开头)

程序启动时,会检查Bind字段并列出这些结构体实例的所有方法,确定哪些方法是公开的(大写字母开头),然后生成前端可以调用的这些公开方法的js版本

在程序运行时,会在js的window对象下添加这些方法从而暴露给js用来调用这些方法

暴露的结构为:window['go']['pkg_name']['struct_name']['func_name']

go           固定项
pkg_name     不包含路径的模块名
struct_name  结构体名称,而非结构体实例名
func_name    该结构体的公开方法名(大写字母开头)

注意项:
pkg_name不包含路径,所以如果不同路径下的同名模块下的同名结构体拥有同名方法,会根据Bind字段中的顺序从后向前覆盖
    如"pkg/config/init"和"pkg/db/init"模块名都为init,都有Init结构体且都拥有GetName方法
    如果传入这两个结构体实例到Bing字段,使用window['go']['init']['Init']['GetName']()调用时
    实际调用的是在Bind字段中最后传入的实例对象的GetName方法

上面使用的是window对象暴露的js方法来调用Go方法,在生成wailsjs目录时wails还会生成对应的可供我们引入的js文件

文件路径为:wailsjsdir/go/pkg_name/struct_name.js,在该js文件中导出了该结构体所有的公开方法

我们可以使用:import { func1, func2, ... } from "wailsjsdir/go/pkg_name/struct_name.js"来引入我们需要的方法,在使用时直接运行func_name()即可

其实通过查看这些js文件我们可以看出,这些js文件也是通过使用返回window对象上暴露的方法来实现的

export function GetName() {
  return window['go']['init']['Init']['GetName']();
}

当使用js运行了一个Go暴露给前端的方法时,返回值永远是一个Promise

Go方法的编写

Go方法的返回值可以有多种情况

一、没有返回值,返回的Promise状态为resolve,值为null
二、1个返回值
    为error类型时
        为nil,Promise状态为resolve,值为null
        非nil,Promise状态为reject,值为error的描述字符串
    为非error类型,Promise状态为resolve,值为返回值转换为js后的数据
三、2个返回值,会优先分析第二个返回值并作为错误依据
    第二个值为error类型时
        为nil,Promise状态和值根据第一个参数确定
        非nil,Promise状态为reject,值为error的描述字符串
    第二个值为非error类型时,Promise状态和值根据第一个参数确定
    第一个值参考一个返回值时的情况
四、返回值超过2个时,返回的Promise状态为resolve,值为null

混淆编译

当我们使用build命令时添加了-obfuscated选项时表示开启代码混淆,为了隐藏暴露的程序结构及函数

此时编译后的前端就无法通过window['go']['pkg_name']['struct_name']['func_name']这样的方式来调用方法了

此时只可以通过使用:import { func1, func2, ... } from "wailsjsdir/go/pkg_name/struct_name.js"的方式在前端中调用方法



网址导航