Thrift 有许多语法规则,这里只介绍核心语法。
1.注释
注释用于对代码进行解释说明,Thrift 支持两种注释方式:
单行注释:以双斜杠 // 开头,从 // 到行尾的内容都会被视为注释。例如:
// 这是一个单行注释
多行注释:以 /* 开头,以 */ 结尾,中间的所有内容都是注释。示例如下:
/*
这是一个多行注释
可以跨越多行
*/
2.命名空间(Namespace)
命名空间用于指定生成代码在不同编程语言中的包名或模块名,避免命名冲突。语法格式为:
namespace <语言> <包名/模块名>
例如,为 Go 语言指定命名空间:
namespace go example.service
这表示生成的 Go 代码会位于 example.service 包下。
3.数据类型
基本数据类型
bool:布尔类型,值为 true 或 false。byte:字节类型,通常用于表示 8 位整数。i16:16 位有符号整数。i32:32 位有符号整数。i64:64 位有符号整数。double:双精度浮点数。string:字符串类型。
复杂数据类型
结构体(Struct):用于定义自定义的数据结构,类似于面向对象编程中的类。语法如下:
struct <结构体名> {
<字段编号>: <字段修饰符> <字段类型> <字段名>[ = <默认值>],
// 可以有多个字段
}
示例:
struct Person {
1: required string name,
2: optional i32 age = 0,
3: optional string address
}
这里的 required 表示字段必须有值,optional 表示字段可以为空。
枚举(Enum):用于定义一组命名的常量值。语法如下:
enum <枚举名> {
<枚举项1>[ = <值1>],
<枚举项2>[ = <值2>],
// 可以有多个枚举项
}
示例:
enum Color {
RED = 1,
GREEN = 2,
BLUE = 3
}
集合类型:
list<元素类型>:表示有序的元素列表。例如,list
4. 服务(Service)
服务用于定义远程调用的接口,包含一系列方法。语法如下:
service <服务名> {
<返回类型> <方法名>(<参数列表>)[ throws (<异常列表>)];
// 可以有多个方法
}
示例:
service UserService {
Person GetUser(1: i32 userId) throws (1: UserNotFoundException notFound),
void UpdateUser(1: Person user)
}
这里定义了一个 UserService 服务,包含 GetUser 和 UpdateUser 两个方法。GetUser 方法可能会抛出 UserNotFoundException 异常。
5. 异常(Exception)
异常用于在服务方法出现错误时抛出。语法与结构体类似:
exception <异常名> {
<字段编号>: <字段修饰符> <字段类型> <字段名>[ = <默认值>],
// 可以有多个字段
}
示例:
exception UserNotFoundException {
1: string message
}
6.常量定义
可以定义常量,语法如下:
const <类型> <常量名> = <值>
示例:
const i32 MAX_USERS = 100
7.包含其他 Thrift 文件
可以使用 include 指令包含其他 Thrift 文件,以复用其中的定义。语法如下:
include "<文件名>"
示例:
include "common.thrift"
这样就可以在当前文件中使用 common.thrift 中定义的类型和服务。
