MENU
// //

FLUX 中的数据类型(二)

August 4, 2023 • 学习生涯,技术分享

Flux语法

变量与基本表达式

import array
s = 1+1
array.form(rows:[{"value":s}])

谓词表达式

import array
s = "abc" == "abc"
array.form(rows:[{"value":s}])

控制语句

import array
x = 1
a = if x == 1 then "green" else "red"
array.form(rows:[{"value":a}])

Flux的基本数据类型

Boolean (布尔型)

import array
x = 1
b = bool(v:x)
array.form(rows:[{"value":b}])

bytes (字节)

bytes(v:"hello")
// Returns [104 101 108 108 111]

Duration 持续时间

duration(v: "1h30m")
// Returns 1h30m
duration(v: 1000000)
// Returns 1ms
duration(v: uint(v: 3000000000))
// Returns 3s

Regular expression 正则表达式

FLUX 语言是 GO 语言实现的,因此使用 GO 的正则表达式语法。正则表达式需要声 明在正斜杠之间 / /

使用正则表达式进行逻辑判断

"abc" =~ /\w/
// Returns true
"z09se89" =~ /^[a-z0-9]{7}$/
// Returns true
"foo" !~ /^f/
// Returns false
"FOO" =~ /(?i)foo/
// Returns true

将字符串转为正则表达式

import "regexp"
regexp.compile(v: "^- [a-z0-9]{7}")
// Returns ^- [a-z0-9]{7} (regexp type)

String 字符串

字符串类型表示一个字符序列。字符串是不可改变的,一旦创建就无法修改

"abc"
"string with double \" quote"
"string with backslash \\"
"日本語"
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"

## Time 时间点

一个 time 类型的变量其实是一个纳秒精度的时间点。

YYYY-MM-DD
YYYY-MM-DDT00:00:00Z

Float 浮点数

FLUX 中的浮点数是 64 位的浮点数。 一个浮点数包含整数位,小数点,和小数位。

0.0
123.4
-123.456

Integer 整数

一个 integer 的变量是一个 64 位有符号的整数。

0
2
1254
-1254

UIntegers 无符号整数

FLUX 语言里不能直接声明无符号整数,但这却是一个 InfluxDB 中具备的类型。在 FLUX 语言中,我们需要使用 uint 函数来讲字符串、整数或者其他数据类型转换成无符号 整数。

uint(v: "123")
// 123
uint(v: true)
// Returns 1
uint(v: 1d3h24m)
// Returns 98640000000000
uint(v: 2021-01-01T00:00:00Z)
// Returns 1609459200000000000
uint(v: 12.54)
// Returns 12
uint(v: -54321)
// Returns 18446744073709497295

Null 空值

FLUX 语言并不能在语法上直接支持声明一个 Null,但是我们可以通过 debug.null 这个 函数来声明一个指定类型的空值。

import "internal/debug"
// Return a null string
debug.null(type: "string")
// Return a null integer
debug.null(type: "int")
// Return a null boolean
debug.null(type: "bool")

#判断值是否为空
import "array"
import "internal/debug"
x = debug.null(type: "string")
y = exists x
// Returns false # 空值返回false 不是空值返回true

display 函数

使用 display( )函数可以将任何类型的值输出为相应的字符串类型

x = bytes(v: "foo")
display(v: x)
// Returns "0x666f6f"

Flux的复合类型

Record(记录)

一个记录是一堆键值对的集合,其中键必须是字符串,值可以是任意类型,在键上没 有空白字符的前提下,键上的双引号可以省略。 在语法上,record 需要使用{}声明,键值对之间使用英文逗号(,)分开。另外,一个 Record 的内容可以为空,也就是里面没有键值对。

通过Influx语句查询,最终返回的都是表流 实际上最终都是一个个Record

Record如何定义

{foo: "bar", baz: 123.4, quz: -2}
{"Company Name": "ACME", "Street Address": "123 Main St.", id:1123445}
#注意 如果key中间有空格的情况下一定要加双引号

如何从Record中读取值

点读取值

如果 key 中没有空白字符,那么你可以使用 .key 的方式从 record 中取值。

c = {name: "John Doe", address: "123 Main St.", id: 1123445}
c.name
// Returns John Doe
c.id
// Returns 1123445

中括号取值

可以使用[" "]的方式取值,当 key 中有空白字符的时候,也只能用这种方式来取值。

c = {"Company Name": "ACME", "Street Address": "123 Main St.", id:
1123445}
c["Company Name"]
// Returns ACME
c["id"]
// Returns 1123445

嵌套与链式取值

这种类似与我们的json 里边有多个对象的时候取值

customer =
 {
 name: "John Doe",
 address: {
 street: "123 Main St.",
 city: "Pleasantville",
 state: "New York"
 }
 }
customer.address.street
// Returns 123 Main St.
customer["address"]["city"]
// Returns Pleasantville
customer["address"].state
// Returns New York

拓展Records知识

record 的 key 是静态的

o = {foo: "bar", baz: 123.4}
o.key
// Error: type error: record is missing label haha
// 错误:类型错误:record 找不到 haha 这个标签

拓展一个 record

相当于你本地git打patch一样

c = {name: "John Doe", id: 1123445}
{c with name: "Xiao Ming", pet: "Spot"}
// Returns {id: 1123445, name: Xiao Ming, pet: Spot}

image-20230803101305481

列出一个 record 中所有的 keys

import "experimental"
c = {name: "John Doe", id: 1123445}
experimental.objectKeys(o: c)
// Returns [name, id]

比较两个 record 是否相等

可以使用双等号= =来判断两个 record 是否相等。如果两个 record 的每个 key,每个key 对应的 value 和类型都相同,那么两个 record 就相等.

{id: 1, msg: "hello"} == {id: 1, msg: "goodbye"}
// Returns false
{foo: 12300.0, bar: 34500.0} == {bar: float(v: "3.45e+04"), foo:
float(v: "1.23e+04")}
// Returns true

将 record 转为字符串

x = {a: 1, b: 2, c: 3}
display(v: x)
// Returns "{a: 1, b: 2, c: 3}"

嵌套 Record 的意义

注意,嵌套的 Record 无法放到 FLUX 语言返回的表流中,这个时候会发生类型错误, 它会说 Record 类型不能充当某一列的类型。那 FLUX 为什么还支持对 Record 进行嵌套使 用呢? 其实这是为了一些网络通讯的功能来服务,在 FLUX 语言中我们有一个 http 库。借助 这个函数库,我们可以向外发送 http post 请求,而这种时候我们就有可能要发送嵌套的 json。我们的 record 在语法层面上和 json 语法是统一的,而且 FLUX 语言提供了一个 json 函数库,借助这个库中的 encode 函数,我们可以轻易地将一个 record 转为 json 字符串然后发送出去。

Array(数组)

数据是一个由相同类型的值构成的有序序列。 在语法上,数组是用方括号[ ]起来的一堆同类型元素,元素之间用英文逗号( , )分隔, 并且类型必须相同

Array如何定义

["1st", "2nd", "3rd"]
[1.23, 4.56, 7.89]
[10, 25, -15]

从 Array 中取值

arr = ["one", "two", "three"]
arr[0]
// Returns one
arr[2]
// Returns two
#这就和我们在Java和C中遍历一个数组是一样的逻辑

检查数组

names = ["John", "Jane", "Joe", "Sam"]
contains(value: "Joe", set: names)
// Returns true

Dictionary(字典)

字典和记录很像,但是 key-value 上的要求有所不同。 一个字典是一堆键值对的集合,其中所有键的类型必须相同,且所有值的的类型必须 相同。 在语法上,dictionary 需要使用方括号[ ]声明,键的后面跟冒号(:)键值对之间需要使 用英文逗号( , )分隔。

Dictionary如何定义

[0: "Sun", 1: "Mon", 2: "Tue"]
["red": "#FF0000", "green": "#00FF00", "blue": "#0000FF"]
[1.0: {stable: 12, latest: 12}, 1.1: {stable: 3, latest: 15}]

引用字典中的值

#(1)导入 dict 包
#(2)使用 dict.get( )并提供下述参数:
#    a) dict:要取值的字典
#    b) key:要用到的 key
#    c) default:默认值,如果对应的 key 不存在就返回该值

import "dict"
positions =
 [
 "Manager": "Jane Doe",
 "Asst. Manager": "Jack Smith",
 "Clerk": "John Doe",
 ]
dict.get(dict: positions, key: "Manager", default: "Unknown 
position")
// Returns Jane Doe
dict.get(dict: positions, key: "Teller", default: "Unknown 
position")
// Returns Unknown position

function(函数)

一个函数是使用一组参数来执行操作的代码块。函数可以是命名的,也可以是匿名的。 在小括号( )中声明参数,并使用箭头=>将参数传递到代码块中。

函数如何定义

square = (n) => n * n
square(n:3)
// Returns 9

为函数提供默认值

chengfa = (a,b=100) => a* b
chengfa(a:3)
// Returns 300

函数包

Flux 的标准库使用包组织起来的。包将 Flux 的众多函数分门别类,默认情况下加载 universe 包,这个包中的函数可以不用 import 直接使用。其他包的函数需要在你的 Flux 脚 本中先用 import 语法导入一下。

import "array"
import "math"
import "influxdata/influxdb/sample"
Last Modified: September 12, 2023