idl-thrift语法| 青训营笔记
这是我参与「第六届青训营 」笔记创作活动的第2天
IDL
thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(InterfaceDescription Language),thrift采用IDL来定义通用的服务接口,然后通过thrift提供的编译器,可以将服务接口编译成不 同语言编写的代码,通过这个方式来实现跨语言的功能。
thrift语法
基本类型
| Type | Desc | GO | JAVA |
|---|---|---|---|
| i8 | 有符号8位整数 | int8 | byte |
| i16 | 有符号16位整数 | int16 | float |
| i32 | 有符号32位整数 | int32 | int |
| i64 | 有符号64位整数 | int64 | long |
| double | 64位浮点数 | float64 | double |
| bool | 布尔值 | bool | boolean |
| string | UTF-8编码的字符串 | string | java.lang.String |
| binary | 未编码的字节序列 | []byte | java.nio.ByteBuffer |
容器类型
| Type | Desc | GO | JAVA |
|---|---|---|---|
| list | 可重复的有序列表 | []T | java.util.List |
| set | 不重复的无序列表 | []T(Go中没有set) | java.util.Set |
| map<K,V> | k-v存储,k不能重复 | mapV | java.util.Map |
常量及类型别名
常量关键字:const,别名关键字:typedef
c
复制代码
//常量定义
const i32 MALE_INT = 1
const map<i32,string>GENDER_MAP = {1:"male",2:"female"}
//某些数据类型比较长可以用别名简化
typedef map<i32,string> gmp
struct类型
struct对应其他语言的类或者结构体,定义格式如下:
xml
复制代码
struct <结构体名称> {
<序号>:[字段性质]<字段类型><字段名称>[=<默认值>][;|,|不写]
}
例如:
arduino
复制代码
struct User {
1:required string name,// required表示该字段必须填写
2:optional i32 age = 0;// =为默认值
3:bool gender//不写默认字段类型为optional
}
struct有以下一些约束:
- struct
不能继承,但是可以嵌套,不能嵌套自己。 - 其成员都是有明确类型
- 成员是被正整数编号过的,其中的编号是
不能重复的,这个是为了在传输过程中编码使用。 - 成员分割符可以是逗号(,)或是分号(:)或者不写,可以混用,但最好统一
- 字段会有
optional和required之分和protobuf一样,但是如果不指定则为无类型,可以不填充该值,但是在序列化传输的时候也会序列化进去,optional是不填充则不序列化,不写为optional,required是必须填充也必须序列化。 - 每个字段可以设置默认值
- 同一文件可以定义多个struct,也可以定义在不同的文件,进行
include引入。
枚举(enum)
thrift不支持枚举类嵌套,枚举常量必须是32位的正整数
ini
复制代码
enum Httpstatus {
OK = 200,
NOTFOUND = 404
}
异常(Exceptions)
异常在语法和功能上类似于结构体,差别是异常使用关键字exception,而且异常是继承每种语言的基础异常类。
csharp
复制代码
exception MyException{
1:i32 errorcode
2:string message
}
service Exampleservice {
string GetName()throws (1:MyException e)
}
service(服务定义类型)
服务的定义方法在语义上等同于面向对象语言中的接口。
scss
复制代码
service HelloService {
i32 sayInt(1:i32 param)
string saystring(1:string param)
bool sayBoolean(1:bool param)
void sayvoid()
}
namespace(命名空间)
类似于其他语言的包名,用.划分层级
注释
和其他语言一样。//单行注释,/* */ 多行注释
include
定义在不同的文件的struct,可用include引入,注意是要加""
makefile
复制代码
include "test.thrift"