thrift数据类型
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
1、Types
Thrift類型系統(tǒng)包括預(yù)定義基本類型,用戶自定義結(jié)構(gòu)體,容器類型,異常和服務(wù)定義
(1) 基本類型
bool: 布爾類型,占一個(gè)字節(jié)
byte: 有符號(hào)字節(jié)
i16:16位有符號(hào)整型
i32:32位有符號(hào)整型
i64:64位有符號(hào)整型
double:64位浮點(diǎn)數(shù)
string:未知編碼或者二進(jìn)制的字符串
注意:thrift不支持無符號(hào)整形,因?yàn)楹芏嗄繕?biāo)語言不存在無符號(hào)整形(比如java)
(2)容器類型
List<t1>:一系列t1類型的元素組成的有序列表,元素可以重復(fù)
Set<t1>:一些t1類型的元素組成的無序集合,元素唯一不重復(fù)
Map<t1,t2>:key/value對(duì),key唯一
容器中的元素類型可以是除service以外的任何合法的thrift類型,包括結(jié)構(gòu)體和異常類型
(3)結(jié)構(gòu)體和異常
Thrift結(jié)構(gòu)體在概念上同c語言的結(jié)構(gòu)體類似,在面向?qū)ο笳Z言中,thrift結(jié)構(gòu)體將被轉(zhuǎn)化為類。
異常在語法和功能上類似于結(jié)構(gòu)體,只是異常使用關(guān)鍵字exception而不是struct關(guān)鍵字來聲明。但它在語義上不同于結(jié)構(gòu)體—當(dāng)定義一個(gè)RPC服務(wù)時(shí),開發(fā)者可能需要聲明一個(gè)遠(yuǎn)程方法拋出一個(gè)異常。
(4)服務(wù)
Thrift中服務(wù)定義的方式和語法等同于面向?qū)ο笳Z言中定義接口。Thrift編譯器會(huì)產(chǎn)生實(shí)現(xiàn)接口的client和server樁。
(5)類型定義
Thrift支持C/C++風(fēng)格的typedef:
typedef i32 MyInteger \\a typedef Tweet ReTweet \\b說明:?
a.? 末尾沒有逗號(hào)?
b.?? struct可以使用typedef
2、枚舉類型
可以像C/C++那樣定義枚舉類型,如:
enum TweetType {TWEET, //aRETWEET = 2, //bDM = 0xa, //cREPLY //d} struct Tweet {1: required i32 userId;2: required string userName;3: required string text;4: optional Location loc;5: optional TweetType tweetType = TweetType.TWEET // e16: optional string language = "english"}說明:
a:編譯器默認(rèn)從0開始賦值
b:可以賦予某個(gè)常量
c:允許常量是十六進(jìn)制整數(shù)
d:末尾沒有逗號(hào)
e:給常量賦缺省值時(shí),使用常量的全稱
不同于protocol buffer,thrift不支持枚舉類嵌套,枚舉常量必須是32位正整數(shù)
3、注釋
Thrift支持shell注釋風(fēng)格、C/C++語言中的單行或多行注釋風(fēng)格
# This is a valid comment./** This is a multi-line comment.* Just like in C.*/// C++/Java style single-line comments work just as well.4、命名空間
Thrift中的命名空間同C++中的namespace和java中的package類似,它們均提供了一種組織(隔離)代碼的方式。因?yàn)槊糠N語言均有自己的命名空間定義方式(如python中有module),thrift允許開發(fā)者針對(duì)特定語言定義namespace:
namespace cpp com.example.project // a namespace java com.example.project // b5、文件包含
Thrift允許文件包含,需要使用thrift文件名作為前綴訪問被包含的對(duì)象,如:
include "tweet.thrift" // a...struct TweetSearchResult {1: list<tweet.Tweet> tweets; // b}說明:
a:thrift文件名需要雙引號(hào)包含,末尾沒有逗號(hào)或者分號(hào)
b:注意tweet前綴
6、常量
Thrift允許用戶定義常量,復(fù)雜的類型和結(jié)構(gòu)體可以使用JSON形式表示:
const i32 INT_CONST = 1234; // aconst map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}說明:
a:分號(hào)是可選的,支持十六進(jìn)制賦值
7、定義結(jié)構(gòu)體
struct Tweet {1: required i32 userId; // a2: required string userName; // b3: required string text;4: optional Location loc; // c16: optional string language = "english" // d}struct Location { // e1: required double latitude;2: required double longitude;}說明:
a:每一個(gè)域都有一個(gè)唯一的正整數(shù)標(biāo)識(shí)符
b:每個(gè)域可以標(biāo)識(shí)為required或者optional(也可以不注明)
c:結(jié)構(gòu)體可以包含其他結(jié)構(gòu)體
d:域可以有缺省值
e:一個(gè)thrift中可以定義多個(gè)結(jié)構(gòu)體,并存在引用關(guān)系
規(guī)范的struct定義中的每個(gè)域均會(huì)使用required或者optional關(guān)鍵字進(jìn)行標(biāo)識(shí)。如果required標(biāo)識(shí)的域沒有賦值,thrift將給予提示。如果optional標(biāo)識(shí)的域沒有賦值,該域?qū)⒉粫?huì)被序列化傳輸。如果某個(gè)optional標(biāo)識(shí)域有缺省值而用戶沒有重新賦值,則該域的值一直為缺省值。
與service不同,結(jié)構(gòu)體不支持繼承,即,一個(gè)結(jié)構(gòu)體不能繼承另一個(gè)結(jié)構(gòu)體。
8、定義服務(wù)
在流行的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多語言間RPC服務(wù)的框架。
Thrift編譯器會(huì)根據(jù)選擇的目標(biāo)語言為server產(chǎn)生服務(wù)接口代碼,為client產(chǎn)生樁代碼。
說明:
a:函數(shù)定義可以使用逗號(hào)或分號(hào)標(biāo)識(shí)結(jié)束
b:參數(shù)可以是基本類型或者結(jié)構(gòu)體,參數(shù)只能是只讀的(const),不可以作為返回值
c:返回值可以是基本類型或者結(jié)構(gòu)體
d:返回值可以是void
注意,函數(shù)中參數(shù)列表的定義方式與struct完全一樣?
Service支持繼承,一個(gè)service可使用extends關(guān)鍵字繼承另一個(gè)service。
轉(zhuǎn)載于:https://my.oschina.net/u/2000675/blog/1542773
總結(jié)
以上是生活随笔為你收集整理的thrift数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用GPU实现无尽草地的实时渲染
- 下一篇: Python中pass、continue