go

语法

go

详情

DolphinDB 对提交执行的代码首先进行语法解析,代码全部解析成功后才开始执行。go 语句的作用是对代码分段进行解析和执行,即先解析并执行 go 语句之前的代码,然后再解析并执行其后的代码。

解析时,一个变量或函数必须被显式定义,后续才可引用。share, enableTableShareAndPersistence, loadPluginrun 等函数在执行过程中会动态注册一些变量或函数,但是解析这些函数的过程中, 并不会注册新的变量或函数。因此,share 等函数之后的代码若需要引用这些函数动态注册的变量或函数,必须使用 go 语句,否则解析后续代码时会抛出未定义变量或函数等异常。

请注意:DolphinDB 的一个语句或函数必须完整的解析才能执行。因此,go 语句应用在一个判断语句、循环语句及其他嵌套语句或者函数体中,将无法生效。

例子

执行以下代码时,系统会抛出变量未定义的异常。

$ t=table(rand(`WMI`PG`TSLA,100) as sym, rand(1..10, 100) as qty, rand(10.25 10.5 10.75, 100) as price)
$ share(t,`st)
$ insert into st values(`AAPL,50,10.25);
Syntax Error: [line #3] Can't recognize table st

DolphinDB 对以上所有代码进行语法解析,发现变量 st 未定义,因此系统抛出异常,不执行任何代码。此时可以在 share 语句后加一个 go 语句,将代码分成两部分。

$ t=table(rand(`WMI`PG`TSLA,100) as sym, rand(1..10, 100) as qty, rand(10.25 10.5 10.75, 100) as price)
$ share(t,`st)
$ go;
$ insert into st values(`AAPL,50,10.25);

DolphinDB 首先解析并执行第一段代码,将表 t 共享为表 st,然后解析并执行第二段代码,往表 st 中插入数据。

以下代码块解析阶段,只注册了变量 fs,函数体 f2() 解析时并未注册。因此,后面的代码解析时会报未定义变量的错误。

$ fs = ["def f2(){return 'haha1';}", "def f2(){return 'haha2';}", "def f2(){return 'haha3';}"];
$ runScript(fs[2]);
$ print(f2());
Syntax Error: [line #25] Cannot recognize the token f2

使用 go 语句,先解析执行第一段代码,可以生成动态变量 f2()。

$ fs = ["def f2(){return 'haha1';}", "def f2(){return 'haha2';}", "def f2(){return 'haha3';}"];
$ runScript(fs[2]);
$ go
$ print(f2());
haha3

go 在 for 循环语句中不能生效。

$ fs = ["def f2(){return 'haha1';}", "def f2(){return 'haha2';}", "def f2(){return 'haha3';}"];
$ for(s in fs){runScript(s); go; print(f2());}

下例中在 test.txt 文件中定义了变量 a=100,通过 run 命令执行该文件后直接调用变量 a,若不使用 go 语句,后续代码中若引用变量 a,编译阶段会报未定义变量 a 的错误。

$ run("D:/test.txt")
$ print(a)
Syntax Error: [line #27] Cannot recognize the token a

$ run("D:/test.txt")
$ go
print(a)