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/