Thrift類型系統旨在容許程序員儘量使用本機類型,不管使用何種編程語言。此信息基於並取代Thrift白皮書中的信息。Thrift IDL爲每一種目標語言提供了用於生成代碼的類型描述。
java
基本類型是側重於全部編程語言可用的關鍵類型:程序員
bool:一個布爾值(true或false)apache
byte:一個8位有符號整數編程
i16:一個16位有符號整數數組
i32:一個32位有符號整數服務器
i64:一個64位有符號整數編程語言
double:一個64位浮點數函數
string:使用UTF-8編碼的文本字符串ui
binary:未編碼的字節流。this
注意:這是目前上述字符串類型的一種特殊形式,用於提供與Java更好的互操做性。目前的記錄計劃在某種程度上將其提高爲基本類型。
Thrift結構體定義了一個通用對象,它們基本等同於OOP語言中的類,可是沒有繼承。結構體具備一組強類型字段,每一個字段都具備惟一的名稱標識符。字段可能具備Thrift IDL中描述的各類註釋(數字字段ID,可選的默認值等) 。
struct Example { 1:i32 number = 0, 2:i64 bigNumber, 3:double decimals, 4:string name = "thrifty" }
字段有optional和required之分,若是不指定則默認爲required。其中required是必填字段,optional是可選字段,非必填的。並且每一個字段能夠設置默認值 。
struct Example { 1: required i32 number = 0, 2:optional i64 bigNumber, 3:double decimals, 4:string name = "thrifty" }
Thrift容器是強類型的容器,映射到大多數編程語言中經常使用的容器類型。
Thrift有三種容器:
list:一個有序的元素列表,轉換成STL vector,Java ArrayList,腳本語言的native數組。
set:一個無序的元素集合,全部元素都是惟一的。轉換成STL set,Java HashSet,Python的set等,PHP不支持set,因此它被視爲相似於List。
map:一個嚴格惟一的鍵值映射。轉換成STL map,Java HashMap,PHP關聯數組,Python/Ruby字典等。雖然提供了默認值,但類型映射並未明確固定。已添加自定義代碼生成器指令以容許用各類目標語言替換自定義類型。
容器元素能夠是任何有效的Thrift類型。
注意:爲了達到最大的兼容性,map的鍵類型應該是基本類型,而不是結構體或容器類型。有一些語言本機map類型不支持更復雜的鍵類型。另外,Json協議僅支持基本類型的鍵類型。
struct Example { 1:i32 number = 0, 2:i64 bigNumber, 3:double decimals, 4:string name = "thrifty", 5:map<string, string> idMap, 6:list<string> telphoneNumbers, 7:set<i32> testSet }
異常在功能上等同於結構體,除了它們在每種目標編程語言中適當地繼承本機異常基類以便與任何給定語言中的本機異常處理無縫集成以外。
exception TException { 1: i32 errCode, 2: string msg }
1.編譯器默認從0開始賦值
2.能夠賦予某個常量某個整數
3.容許常量是十六進制整數
4.末尾沒有分號
5.給常量賦缺省值時,使用常量的全稱
enum TResult { SUCCEED = 0, FAILED = 1 }
在變量前面加上const
const i32 SUCCEED = 0;
服務使用Thrift類型進行定義。服務的定義在語義上等同於定義面向對象編程中的接口(或純虛擬抽象類)。Thrift編譯器生成實現該接口的功能齊全的客戶端和服務器原型。
服務由一組命名函數組成,每一個函數都有一個參數列表和一個返回類型。
請注意,除了全部其餘定義的Thrift類型以外,void是函數返回的有效類型。此外,單向修飾符關鍵字能夠添加到void函數中,該函數將生成不等待響應的代碼。請注意,純粹的void函數會向客戶端返回一個響應,以確保操做在服務器端完成。使用單向方法調用客戶端將只能保證請求在傳輸層成功。服務器能夠並行/不按順序執行同一客戶端的單向方法調用。
service StringCache { void setNode(1:i32 key, 2:string value), string getNode(1:i32 key) throws(1:TException exp), void delNode(1:i32 key) }
一個包含全部來自另外一個文件的符號可見(帶有前綴),並將相應的包含語句添加到爲此Thrift文檔生成的代碼中。該特性能夠清晰地管理代碼模塊。
include "example.thrift" service StringTest { void sayHello()throws(1:example.TException exp) }
Thrift中的命名空間相似於C++中的namespace和java中的package,它們提供了一種組織(隔離)代碼的簡便方式。命名空間也能夠用於解決類型定義中的名字衝突。
namespace java thrift.test
namespace cpp thrift.test
註釋
支持Java多行和單行註釋風格。
/** * Program doctext. * Seriously, this is the documentation for this whole program. */ // this is a test