1.类型
thrift的类型系统包括预定于的基本类型,用户自定义结构体,容器类型,异常和服务定义。
thrift不支持无符号类型,因为很多编程语言不存在无符号类型。
(1.1)基本类型
bool:布尔类型(true or false),占用一个字节
byte:字节
i16:16位整型
i32:32位整型
i64:64位整型
double:64位浮点数
binary:未经过编码的字节流
string:未知编码或者二进制字符串
(1.2)容器类型
Thrift容器与类型密切相关,它与当前流行编程语言提供的容器类型相对应,采用java泛型风格表示的。Thrift提供了3种容器类型
list<t1>:一系列的t1类型组成的有序表,元素可以重复。
set<t1>:一系列的t1类型组成的无序集合,元素不可以重复。
map<t1,t2>:以t1为key,t2为value的键值对,t1不可以重复。
容器的类型可以是除了service之外的任何Thrift类型包括结构体和异常。
(1.3)结构体和异常
Thrift的结构体与C语言的结构体相似,一种将各种相关属性封装在一起的方式,在面向对象的语言中,它们常被转换成类。
异常与结构体类似,但是它的声明使用exception而不是struct,在语义上不同于struct,当定义远程调用服务时,开发者可能需要声明一个远程方法抛出一个异常。
struct People {
1: string name;
2: i32 age;
}
exception RequestException {
1: i32 code;
2: string error_info;
}
(1.4)服务
服务的定义类似于面向对象编程中的接口定义。
Service支持继承,一个service可使用extends关键字继承另一个service。
service HelloWord {
string Action(1: string name, 2: i32 age);
}
(1.5)类型定义
thrift支持C/C++中的typedef
typedef i32 MyInteger
typedef Tweet ReTweet
(1.6)枚举类型
thrift可以使用枚举
enum TweetType {
TWEET,
RETWEET = 2,
DM = 0xa,
REPLY
}
struct Tweet {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
5: optional TweetType tweetType = TweetType.TWEET
6: optional string language = "english"
}
说明:
a. 编译器默认从0开始赋值
b. 可以赋予某个常量某个整数
c. 允许常量是十六进制整数
d. 末尾没有逗号
e. 给常量赋缺省值时,使用常量的全称
(1.7)常量
thrift支持常量,使用关键字const
const i32 INT_MAX= 10
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
2.注释
thrift支持shell风格的注释,也支持C/C++风格。
3.命名空间
thrift的命名空间与C++的命名空间和java的pakeage类似
格式:namespace 语言名 路径
4.文件包含
相当于C++的include和java的import,使用关键字include定义
include "tweet.thrift"
5.定义结构体
thrift提供两个关键字required,optional,分别用于表示对应的字段时必填的还是可选的。
结构体中可以包含结构体。
struct Location {
1: required double latitude;
2: required double longitude;
}struct Tweet {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
5: optional string language = "english"
}
参考链接:http://diwakergupta.github.io/thrift-missing-guide/